首頁  >  文章  >  Java  >  詳細分析mybatis中resultType和resultMap的差異與聯繫

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

巴扎黑
巴扎黑原創
2017-07-17 13:21:583950瀏覽

在使用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

 

2fcf37cc8639c0835f2a112fe5f93a849eef2c25b88ca2d81d394f11ec96c407e7278c69b1e0021e9427bf255a0086f7bb49b36718ffba6c40aa7d011fafcc356ebaf93ccf0a7eb73abf17f5d66f496d

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

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

669abfcbe0c33fe8796fe4e80dcc38da
select 
 id, classname, deptname
from tb_class
where id = #{id,jdbcType=INTEGER}
18bb6ffaf0152bbe49cd8a3620346341
 <br>

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

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

a2aa3edd282ebb7d674f208ca16e6482select 
 id, classname, deptname
from tb_class
where id = #{id,jdbcType=INTEGER}18bb6ffaf0152bbe49cd8a3620346341

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

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

org.cxxy.base.cxsc.entity.TbClassDatail

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

resultMap

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

 訂單查詢清單

67b7af552f22717e0a27bb8ca8afddafSELECT
    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_id18bb6ffaf0152bbe49cd8a3620346341 

 60847b4eb6c3b5a41f2888550c5ca412

1bc9007c1b08a5a41bb5ee9be64a55c77cb486de3528c1e544b606da1e2164ae6cf1cda1774140b1bf7e54614c8f58e9e08450006b72f6e37b32564ebf7e3714e38a9cf50eb8e25da5892c8813ca0011a1a7d4d2b193733ef0c15d86ce05f5537d6d4df2e47d8c9389fee9b1f90ca509285d3778291c3d7aa6eafe5c70300921113aecbcc56d2525429c3d61b48a1d346cc0a7625caa65b9709a1e50bbd52c945e983f6196ee2a11899ac257ac4a761a62a82c88b9c7d4583fd468de5781adfc29510f87cb44cd62c70fc7046aedde68501f605e20e4cedea353a3c24c992da491fc0312a46e774fade754e0d6bf5f586ebaf93ccf0a7eb73abf17f5d66f496d

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

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

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

注:collection 标签是一对多的映射,常用于一对多中扩展类下的List26f8748aa4657b998cc4ad34c80d1a5b的属性
   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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn