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