【Mybatis】——ResultMap學習

開篇

在《mybatis的配置文件學習》中已經接觸到了resultMap的用法,sql查詢出來的列名和pojo的屬性名不一致則無法映射,通過定義一個resultMap對列名和pojo屬性名之間作一個映射關係就可以解決該的問題,博客中提到的是簡單屬性,那麼如果在返回的結果中包括對象類型或對象類型的集合使用resultMap應該如何映射呢?而使用resultType是否能夠實現呢?

正文

使用resultMap的實例映射單個或多個對象集合的實例。

Pojo

訂單:做以下兩個不同的測試userorderdetails屬性對應的註釋掉一個。

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 class User {
 
//屬性名和數據庫表的字段對應
private int id;
private String username;// 用戶姓名
private String sex;// 性別
private Date birthday;// 生日
private String address;// 地址
}

 

一對一:關聯查詢到的單個對象:

需求說明:查詢訂單信息,關聯查詢創建訂單的用戶信息,一個訂單隻能屬於一個用戶

 

Mapper.xml

resulMap映射單個pojo對象,使用的是association

<!-- 訂單查詢關聯用戶的resultMap
將整個查詢的結果映射到cn.itcast.mybatis.po.Orders中-->
<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">
<!-- 配置映射的訂單信息 -->
<!-- id:指定查詢列中的唯 一標識,訂單信息的中的唯 一標識,如果有多個列組成唯一標識,配置多個id
column:訂單信息的唯 一標識 列
property:訂單信息的唯 一標識 列所映射到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/>
<!-- 配置映射的關聯的用戶信息 -->
<!-- association:用於映射 關聯查詢單個對象的信息
property:要將關聯查詢的用戶信息映射到Orders中哪個屬性-->
<association property="user"  javaType="cn.itcast.mybatis.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>

使用resultMapstatement

<!-- 查詢訂單關聯查詢用戶信息,使用resultmap -->
<select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id
</select>

一對多:關聯查詢到多條記錄映射到集合對象:

需求說明:查詢訂單信息,關聯查詢該條訂單的多條詳細信息,一個訂單可以包括多個商品,所以可以包括多條詳細信息

Mapper.xml

resulMap映射多個pojo對象的集合,使用的是collection

<!-- 訂單及訂單明細的resultMap
 -->
<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" >
<!-- 訂單信息 -->
<!-- 配置映射的訂單信息 -->
<!-- id:指定查詢列中的唯 一標識,訂單信息的中的唯 一標識,如果有多個列組成唯一標識,配置多個id
column:訂單信息的唯 一標識 列
property:訂單信息的唯 一標識 列所映射到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進行映射
collection:對關聯查詢到多條記錄映射到集合對象中
property:將關聯查詢到多條記錄映射到cn.itcast.mybatis.po.Orders哪個屬性
ofType:指定映射到list集合屬性中pojo的類型
 -->
 <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
     <!-- id:訂單明細唯 一標識
     property:要將訂單明細的唯 一標識 映射到cn.itcast.mybatis.po.Orderdetail的哪個屬性
       -->
     <id 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>

結果:




使用resultType實現:

查詢訂單信息,關聯查詢創建訂單的用戶信息

 

第一步:建立擴展pojo類,該類繼承orders類,同時將sql查到的用戶名、性別、地址作爲擴展屬性添加。

//通過此類映射訂單和用戶查詢的結果,讓此類繼承包括 字段較多的pojo類
public class OrdersCustom extends Orders{
//添加用戶屬性
private String username;
private String sex;
private String address;
}


第二步:編寫mapper.xml文件,和之前使用的相同

<select id="findOrdersUser" resultType="cn.itcast.mybatis.po.OrdersCustom">
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id
</select>


resultType使用比較簡單,但是無法映射出pojo對象,也無法映射出pojo對象的list集合。結果如下:


 

 

 

總結

resultType

作用:將查詢結果按照sql列名pojo屬性名一致性映射到pojo中。

resultMap

作用:使用associationcollection完成一對一和一對多的高級映射。

 

兩者都可以完成一對一、一對多的查詢,只是返回的結果不同,我們可以根據自己的需求確定到底使用哪個。例如同樣是查詢訂單信息,關聯查詢創建訂單的用戶信息需求,如果返回的數據是在頁面上進行展示,我們就沒有必要使用resultMapuser的相關信息包裝到user對象中,這樣使用的使用需要先拿到user對象然後獲取屬性中的值,如果使用resultType就可以直接遍歷結果獲得user相關信息在頁面上進行展示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章