MyBatis高等映照進修教程。本站提示廣大學習愛好者:(MyBatis高等映照進修教程)文章只能為提供參考,不一定能成為您想要的結果。以下是MyBatis高等映照進修教程正文
對mybatis基本入門不太清晰的同伙可以參考下本篇文章:MyBatis入門進修教程(一)-MyBatis疾速入門。
熟悉MyBatis
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷徙到了谷歌 code,而且更名為MyBatis 。2013年11月遷徙到Github。
iBATIS一詞起源於“internet”和“abatis”的組合,是一個基於Java的耐久層框架。iBATIS供給的耐久層框架包含SQL Maps和Data Access Objects(DAO)
mybatis圖冊
簡介
後面說過了簡略的數據庫查詢和治理查詢,在開辟需求中有一些一對1、一對多和多對多的需求開辟,如在開辟購物車的時刻,定單和用戶是一對一,用戶和定單是一對多,用戶和商品是多對多。這些在Hibernate開辟中也是罕見的,Hibernate中是經由過程數據映照來完成的,在MyBatis中也是經由過程設置裝備擺設文件的數據映照來完成。
一對一查詢
假如我們要查詢定單信息,聯系關系查詢創立定單的用戶信息,那末這就是典范的一對一查詢。完成一對一查詢有兩種完成方法:應用resultType和resultMap。resultType須要額定界說POJO,然後把查詢的字段和新界說的POJO逐個對應。resultMap則須要經由過程設置裝備擺設文件來完成兩個POJO的一對一聯系關系。上面我們就這兩種方法來分離完成。
resultType:
1、創立POJO,將須要映照的新的屬性參加到新的POJO中。
public class OrderCustom extends Orders{ //添加用戶信息 private String username; private String sex; private String address; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
2、映照文件:
<select id="findOrderUser" resultType="com.luchao.mybatis.first.po.OrderCustom"> select orders.*, user.username, user.sex, user.address from orders,user where orders.user_id = user.id </select>
3、Mapper接口的完成:
//查詢定單和用戶信息 public List<OrderCustom> findOrderUser() throws Exception;
4、測試代碼:
public void findOrdersUser() throws Exception { // 獲得sqlSession對象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 創立OrderMapper對象,MyBatis主動生成mapper署理 OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); // 挪用orderMapper的辦法,查詢定單和用戶信息 List<OrderCustom> orderCustoms = orderMapper.findOrderUser(); System.out.println(orderCustoms.size()); }
resultMap完成:
resultMap將查詢成果中的定單信息映照到Orders對象中,在orders類中添加User屬性,將聯系關系查詢出來的用戶信息映照到orders對象中的user屬性中。
1、創立POJO,在Order類中參加User屬性。
public class Orders { private Integer id; private Integer userId; private String number; private Date createtime; private String note; //用戶信息 private User user; //定單條目 private List<Orderdetail> orderdetails; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number == null ? null : number.trim(); } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } public String getNote() { return note; } public void setNote(String note) { this.note = note == null ? null : note.trim(); } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public List<Orderdetail> getOrderdetails() { return orderdetails; } public void setOrderdetails(List<Orderdetail> orderdetails) { this.orderdetails = orderdetails; } }
2、映照文件:
<!-- 定單查詢聯系關系用戶的resultMap,將全部查詢成果映照到orders中 --> <resultMap type="com.luchao.mybatis.first.po.Orders" id="ordersUserResultMap"> <id column="id" property="id" /> <result column="user_id" property="userId" /> <result column="number" property="number" /> <result column="createtime" property="createtime" /> <result column="note" property="note" /> <!-- 設置裝備擺設映照的聯系關系的用戶信息 --> <!-- association:用於映照聯系關系查詢單個對象的信息 property:要將聯系關系查詢的用戶信息映照到Orders中哪一個屬性 --> <association property="user" javaType="com.luchao.mybatis.first.po.User"> <!-- id:聯系關系查詢用戶的唯 一標識 column:指定唯 一標識用戶信息的列 javaType:映照到user的哪一個屬性 --> <id column="user_id" property="id" /> <result column="username" property="username" /> <result column="sex" property="sex" /> <result column="address" property="address" /> </association> </resultMap> <select id="findOrderUserMap" resultMap="ordersUserResultMap"> select orders.*, user.username, user.sex, user.address from orders,user where orders.user_id = user.id </select>
association:用於映照聯系關系查詢單個對象的信息,property:要將聯系關系查詢的用戶信息映照到Orders中哪一個屬性。
3、Mapper接口
//查詢定單和用戶信息經由過程resultMap public List<Orders> findOrderUserMap() throws Exception;
4、測試代碼:
public void findOrdersUserMap() throws Exception { // 獲得sqlSession對象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 創立OrderMapper對象,MyBatis主動生成mapper署理 OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); // 挪用orderMapper的辦法,查詢定單和用戶信息 List<Orders> orders = orderMapper.findOrderUserMap(); System.out.println(orders.size()); }
resultType和resultMap完成一對一查詢總結:
resultType:應用resultType完成較為簡略,假如pojo中沒有包含查詢出來的列名,須要增長列名對應的屬性,便可完成映照。假如沒有查詢成果的特別請求建議應用resultType。
resultMap:須要零丁界說resultMap,完成有點費事,假如對查詢成果有特別的請求,應用resultMap可以完成將聯系關系查詢映照pojo的屬性中。resultMap可以完成延遲加載,resultType沒法完成延遲加載。
一對多查詢
假如須要查詢定單及定單明細的信息,那末這就是一對多的查詢需求。
1、POJO和下面resultMap的Order的POJO雷同,將定單明細設為List作為Order的屬性。
2、映照文件:
<!-- 定單及定單明細和用戶信息的map 應用繼續不消在設置裝備擺設定單和用戶信息 --> <resultMap type="com.luchao.mybatis.first.po.Orders" id="ordersOrderdetailResultMap" extends="ordersUserResultMap"> <collection property="orderdetails" ofType="com.luchao.mybatis.first.po.Orderdetail"> <result column="orderdetail_id" property="id" /> <result column="items_id" property="itemsId" /> <result column="items_num" property="itemsNum" /> <result column="orders_id" property="ordersId" /> </collection> </resultMap> <select id="findOrderAndOrderdetailMap" resultMap="ordersOrderdetailResultMap"> select orders.*, user.username, user.sex, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id from orders,user,orderdetail where orders.user_id = user.id and orderdetail.orders_id = orders.id </select>
定單及定單明細的resultMap,應用extends繼續,不消在中設置裝備擺設定單信息和用戶信息的映照。
collection:對聯系關系查詢到多筆記錄映照到聚集對象中,property:將聯系關系查詢到多筆記錄映照到Orders哪一個屬性。
ofType:指定映照到list聚集屬性中pojo的類型,留意這裡是ofType與一對一照樣有差別的。
3、Mapper接口:
//查詢定單、定單明細和用戶信息經由過程resultMap
public List<Orders> findOrderAndOrderdetailMap() throws Exception;
4、測試代碼:
public void findOrderAndOrderdetailMap() throws Exception { // 獲得sqlSession對象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 創立OrderMapper對象,MyBatis主動生成mapper署理 OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); // 挪用orderMapper的辦法,查詢定單和用戶信息 List<Orders> orders = orderMapper.findOrderAndOrderdetailMap(); System.out.println(orders.get().getOrderdetails().size()); System.out.println(orders.size()); }
一對多小結:
mybatis應用resultMap的collection對聯系關系查詢的多筆記錄映照到一個list聚集屬性中。
應用resultType完成:
將定單明細映照到orders中的orderdetails中,須要本身處置,應用兩重輪回遍歷,去失落反復記載,將定單明細放在orderdetails中。如許會比擬費事。
多對多
假如我們查詢用戶及用戶購置商品信息,這個就是多對多,可使用MyBatis的多對多映照。
將用戶信息映照到user中。在user類中添加定單列表屬性List<Orders> orderslist,將用戶創立的定單映照到orderslist,在Orders中添加定單明細列表屬性List<OrderDetail>orderdetials,將定單的明細映照到orderdetials,在OrderDetail中添加Items屬性,將定單明細所對應的商品映照到Items。
1、POJO
public class Orderdetail { private Integer id; private Integer ordersId; private Integer itemsId; private Integer itemsNum; //商品信息 private Items items; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getOrdersId() { return ordersId; } public void setOrdersId(Integer ordersId) { this.ordersId = ordersId; } public Integer getItemsId() { return itemsId; } public void setItemsId(Integer itemsId) { this.itemsId = itemsId; } public Integer getItemsNum() { return itemsNum; } public void setItemsNum(Integer itemsNum) { this.itemsNum = itemsNum; } public Items getItems() { return items; } public void setItems(Items items) { this.items = items; } @Override public String toString() { return "Orderdetail [id=" + id + ", ordersId=" + ordersId + ", itemsId=" + itemsId + ", itemsNum=" + itemsNum + "]"; } }
2、映照文件:
<!-- 查詢用戶及購置的商品 --> <resultMap type="com.luchao.mybatis.first.po.User" id="ordersItemsResultMap"> <!-- 用戶信息 --> <id column="user_id" property="id" /> <result column="username" property="username" /> <result column="sex" property="sex" /> <result column="address" property="address" /> <!-- 定單信息 一個用戶對應多個定單,應用collection映照 --> <collection property="ordersList" ofType="com.luchao.mybatis.first.po.Orders"> <id column="id" property="id" /> <result column="user_id" property="userId" /> <result column="number" property="number" /> <result column="createtime" property="createtime" /> <result column="note" property="note" /> <!-- 定單明細 一個定單包含 多個明細 --> <collection property="orderdetails" ofType="com.luchao.mybatis.first.po.Orderdetail"> <id column="id" property="id" /> <result column="items_id" property="itemsId" /> <result column="items_num" property="itemsNum" /> <result column="orders_id" property="ordersId" /> <!-- 商品信息 一個定單明細對應一個商品 --> <association property="items" javaType="com.luchao.mybatis.first.po.Items"> <id column="items_id" property="id" /> <result column="items_name" property="name" /> <result column="items_detail" property="detail" /> <result column="items_price" property="price" /> </association> </collection> </collection> </resultMap> <select id="findOrderAndItemMap" resultMap="ordersItemsResultMap"> select orders.*, user.username, user.sex, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id, items.id items_id, items.name items_name, items.detail items_detail, items.price items_price from orders,user,orderdetail,items where orders.user_id = user.id and orderdetail.orders_id = orders.id AND orderdetail.items_id = items.id </select>
可以看出,多對多根本上就是一對多和一對一的組合,一切龐雜成績根本都是簡略成績的組合,只需細細剖析,理清晰其道理。
3、Mapper接口:
//查詢定單、定單明細和用戶信息經由過程resultMap public List<User> findOrderAndItemMap() throws Exception;
4、測試代碼:
public void findOrderAndItemMap() throws Exception { // 獲得sqlSession對象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 創立OrderMapper對象,MyBatis主動生成mapper署理 OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); // 挪用orderMapper的辦法,查詢定單和用戶信息 List<User> users = orderMapper.findOrderAndItemMap(); System.out.println(users.get().getOrdersList().get() .getOrderdetails().get().getId()); // System.out.println(orders.size()); }
多對多查詢總結:
上邊的需求就應用resultType將查詢到的記載映照到一個擴大的pojo中,很簡略完成明細清單的功效,然則這類不克不及完成延遲加載。應用resultMap將用戶購置的商品明細列表映照到對象中,可以完成延遲加載。應用resultMap是針對那些對查詢成果映照有特別請求的功效,,好比特別請求映照成list中包含 多個list。
resultMap總結
1、resultType:
感化:
將查詢成果依照sql列名pojo屬性名分歧性映照到pojo中。
場所:
罕見一些明細記載的展現,好比用戶購置商品明細,將聯系關系查詢信息全體展現在頁面時,此時可直接應用resultType將每筆記錄映照到pojo中,在前端頁面遍歷list(list中是pojo)便可。
2、resultMap:
應用association和collection完成一對一和一對多高等映照(對成果有特別的映照請求)。
association:
感化:
將聯系關系查詢信息映照到一個pojo對象中。
場所:
為了便利查詢聯系關系信息可使用association將聯系關系定單信息映照為用戶對象的pojo屬性中,好比:查詢定單及聯系關系用戶信息。
應用resultType沒法將查詢成果映照到pojo對象的pojo屬性中,依據對成果集查詢遍歷的須要選擇應用resultType照樣resultMap。
collection:
感化:
將聯系關系查詢信息映照到一個list聚集中。
場所:
為了便利查詢遍歷聯系關系信息可使用collection將聯系關系信息映照到list聚集中,好比:查詢用戶權限規模模塊及模塊下的菜單,可以使用collection將模塊映照到模塊list中,將菜單列表映照到模塊對象的菜單list屬性中,如許的作的目標也是便利對查詢成果集停止遍歷查詢。
假如應用resultType沒法將查詢成果映照到list聚集中。
以上內容是小編給年夜家引見的MyBatis高等映照進修教程,願望對年夜家有所贊助,假如年夜家想懂得更多內容,敬請存眷網站!