在使用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中文網其他相關文章!