程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> MyBatis高等映照進修教程

MyBatis高等映照進修教程

編輯:關於JAVA

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高等映照進修教程,願望對年夜家有所贊助,假如年夜家想懂得更多內容,敬請存眷網站!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved