首頁 > Java > java教程 > 詳細分析mybatis中resultType和resultMap的差異與聯繫

詳細分析mybatis中resultType和resultMap的差異與聯繫

巴扎黑
發布: 2017-07-17 13:21:58
原創
3956 人瀏覽過

在使用mybatis進行資料庫連接操作時對於SQL語句回傳結果的處理通常有兩種方式,一種就是resultType另一種就是resultMap,下面說下我對這兩者的認識和理解

 

例如,我們平常使用的單表查詢,很多時候使用的就是resultType

下來,看一段程式碼吧

 1 package org.cxxy.base.cxsc.entity; 2  3 public class TbClass { 4     private Integer id; 5  6     private String classname; 7  8     private String deptname; 9 10     public Integer getId() {11         return id;12     }13 14     public void setId(Integer id) {15         this.id = id;16     }17 18     public String getClassname() {19         return classname;20     }21 22     public void setClassname(String classname) {23         this.classname = classname == null ? null : classname.trim();24     }25 26     public String getDeptname() {27         return deptname;28     }29 30     public void setDeptname(String deptname) {31         this.deptname = deptname == null ? null : deptname.trim();32     }33 }
登入後複製

上面的PO類別我使用的是我的一個小Demo

下來開始貼我的XML Mapper

 

<resultMap id="BaseResultMap" type="org.cxxy.base.cxsc.entity.TbClass"><id column="id" jdbcType="INTEGER" property="id" /><result column="classname" jdbcType="VARCHAR" property="classname" /><result column="deptname" jdbcType="VARCHAR" property="deptname" /></resultMap>
登入後複製

這個resultMap是對應的我的po類別的屬性

下來,貼出我的xml的單表查詢statement

<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
登入後複製
select 
 id, classname, deptname
from tb_class
where id = #{id,jdbcType=INTEGER}
</select>
登入後複製
 <br>
登入後複製

parameterType代表的是輸入參數(例如:select * from tb_class where id = "xxxx"),resultMap表示映射的結果集,從命名中也可以看到Map,當然是結果集了,

上述程式碼所代表的單表查詢(一對一),當然,在一般開發的時候,像這種映射,我們一般會使用下述的寫法

<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="类的全限定名">select 
 id, classname, deptname
from tb_class
where id = #{id,jdbcType=INTEGER}</select>
登入後複製

即是說所得到的結果一樣,一般在我們理解方面,盡量還是選擇後者

但是如果根據客戶的需求的變化,比如說寫出了類別的擴展類別

org.cxxy.base.cxsc.entity.TbClassDatail
登入後複製

如果,在擴展類別中引入了外類(其他的表的屬性(和本類別沒有共同的屬性)),我們可以使用resultMap,但是也並非完全

resultMap

定义po类
在Orders类中加入User属性。
在Orders类中加入List<Orderdetail> orderdetails属性
登入後複製

 訂單查詢清單

<select id="findOrdersDetailList" resultMap="userorderdetailmap">SELECT
    orders.*,
    user.username,
    user.address,
    orderdetail.id orderdetail_id,
    orderdetail.items_id,
    orderdetail.items_num
    FROM orders,user,orderdetail
    WHERE orders.user_id = user.id
    AND orders.id = orderdetail.orders_id</select> 
登入後複製

 

<!-- 订单信息resultmap --><resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap"><id property="id"column="id"/><result property="user_id" column="user_id"/><result property="number" column="number"/><association property="user" javaType="cn.itcast.mybatis.po.User"><id property="id" column="user_id"/><result property="username" column="username"/><result property="address" column="address"/></association><collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"><id property="id" column="orderdetail_id"/><result property="items_id" column="items_id"/><result property="items_num" column="items_num"/></collection></resultMap>
登入後複製

上面的程式碼,我是貼的某培訓機構的訂單查詢程式碼,

  上面的實體類別的關係是:Order----->User  一對一(一個使用者一個訂單)      Order------->OrderDetail  一對一(一個使用者一個訂單)      Order------->OrderDetail  一對一(一個訂單有多條訂單明細)

像這種的一對多、多對多查詢的映射,我們盡量使用resultMap

注:collection 标签是一对多的映射,常用于一对多中扩展类下的List<po对象>的属性
   association标签适用扩展类包含的一对一的po类对象属性
登入後複製

MyBatis中關於resultType和resultMap的區別

  MyBatis中在查詢進行select映射的時候,回傳類型可以用resultType,也可以用resultMap,resultType是直接表示回傳類型的(對應著我們的model物件中的實體),而resultMap則是對外部ResultMap的引用(事先定義了db和model之間的隱射key-->value關係),但是resultType跟resultMap不能同時存在。
  在MyBatis進行查詢映射時,其實查詢出來的每一個屬性都是放在一個對應的Map裡面的,其中鍵是屬性名,值則是其對應的值。
  ①當提供的回傳類型屬性是resultType時,MyBatis會將Map裡面的鍵值對取出賦給resultType所指定的物件對應的屬性。所以其實MyBatis的每一個查詢映射的回傳類型都是ResultMap,只是當提供的回傳類型屬性是resultType的時候,MyBatis對自動的給把對應的值賦給resultType所指定物件的屬性。
  ②當提供的回傳類型是resultMap時,因為Map無法很好地表示領域模型,就需要自己再進一步的把它轉換為對應的對象,這常常在複雜查詢中很有作用。

總結一下

resultType:

功能:

         將查詢結果依照sql列名pojo屬性名一致性對應到pojo中(適用於單一表僅查詢)。

場合:

         常見一些明細記錄的展示,例如使用者購買商品明細,將關聯查詢資訊全部顯示在頁面時,此時可直接使用resultType將每一筆記錄對應到pojo中,在前端頁面遍歷list(list中是pojo)即可。

以上是詳細分析mybatis中resultType和resultMap的差異與聯繫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板