1. 程式人生 > >ResultMap和ResultType在使用中的區別

ResultMap和ResultType在使用中的區別

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

resultType:當使用resultType做SQL語句返回結果型別處理時,對於SQL語句查詢出的欄位在相應的pojo中必須有和它相同的欄位對應,而resultType中的內容就是pojo在本專案中的位置。

因此對於單表查詢的話用resultType是最合適的。但是,如果在寫pojo時,不想用資料庫表中定義的欄位名稱,也是可以使用resultMap進行處理對應的。多表連線查詢時,若是一對一的連線查詢,那麼需要新建一個pojo,pojo中包括兩個表中需要查詢出的所有的欄位,這個地方的處理方式通常為建立一個繼承一個表字段的pojo,再在裡面新增另外一個表內需要查詢出的欄位即可。若是一對多查詢時,若是使用內連線查詢,則很可能出現查詢出的欄位有重複。使用雙重for迴圈巢狀處理即可。

resultMap:當使用resultMap做SQL語句返回結果型別處理時,通常需要在mapper.xml中定義resultMap進行pojo和相應表字段的對應。

  1. <!-- 訂單查詢關聯使用者的resultMap  
  2.     將整個查詢的結果對映到cn.itcast.mybatis.po.Orders中  
  3.      -->  
  4.     <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">  
  5.         <!-- 配置對映的訂單資訊 -->  
  6.         <!-- id:指定查詢列中的唯 一標識,訂單資訊的中的唯 一標識,如果有多個列組成唯一標識,配置多個id  
  7.             column:訂單資訊的唯 一標識 列  
  8.             property:訂單資訊的唯 一標識 列所對映到Orders中哪個屬性  
  9.           -->  
  10.         <id column="id" property="id"/>  
  11.         <result column="user_id" property="userId"/>  
  12.         <result column="number" property="number"/>  
  13.         <result column="createtime"
     property="createtime"/>  
  14.         <result column="note" property="note"/>         
  15.     </resultMap>  

resultMap對於一對一表連線的處理方式通常為在主表的pojo中新增巢狀另一個表的pojo,然後在mapper.xml中採用association節點元素進行對另一個表的連線處理。例如:

  1. <!-- 訂單查詢關聯使用者的resultMap  
  2.     將整個查詢的結果對映到cn.itcast.mybatis.po.Orders中  
  3.      -->
  4.     <resultMaptype="cn.itcast.mybatis.po.Orders"id="OrdersUserResultMap">
  5.         <!-- 配置對映的訂單資訊 -->
  6.         <!-- id:指定查詢列中的唯 一標識,訂單資訊的中的唯 一標識,如果有多個列組成唯一標識,配置多個id  
  7.             column:訂單資訊的唯 一標識 列  
  8.             property:訂單資訊的唯 一標識 列所對映到Orders中哪個屬性  
  9.           -->
  10.         <idcolumn="id"property="id"/>
  11.         <resultcolumn="user_id"property="userId"/>
  12.         <resultcolumn="number"property="number"/>
  13.         <resultcolumn="createtime"property="createtime"/>
  14.         <resultcolumn="note"property=note/>
  15.         <!-- 配置對映的關聯的使用者資訊 -->
  16.         <!-- association:用於對映關聯查詢單個物件的資訊  
  17.         property:要將關聯查詢的使用者資訊對映到Orders中哪個屬性  
  18.          -->
  19.         <associationproperty="user"javaType="cn.itcast.mybatis.po.User">
  20.             <!-- id:關聯查詢使用者的唯 一標識  
  21.             column:指定唯 一標識使用者資訊的列  
  22.             javaType:對映到user的哪個屬性  
  23.              -->
  24.             <idcolumn="user_id"property="id"/>
  25.             <resultcolumn="username"property="username"/>
  26.             <resultcolumn="sex"property="sex"/>
  27.             <resultcolumn="address"property="address"/>
  28.         </association>
  29.     </resultMap>

若是一對多的表連線方式,比如訂單表和訂單明細表即為一對多連線,若是不對sql語句進行處理,由於一個訂單對應多條訂單明細,因此查詢出的結果對於訂單表資料來說將會出現重複,例如:

resultMap的處理方式為在訂單表資料的pojo中新增一個list,list中為訂單明細表的屬性,在mapper.xml中採用如下的處理方式:

  1. !-- 訂單及訂單明細的resultMap  
  2.     使用extends繼承,不用在中配置訂單資訊和使用者資訊的對映  
  3.      -->
  4.     <resultMaptype="cn.itcast.mybatis.po.Orders"id="OrdersAndOrderDetailResultMap"extends="OrdersUserResultMap">
  5.         <!-- 訂單資訊 -->
  6.         <!-- 使用者資訊 -->
  7.         <!-- 使用extends繼承,不用在中配置訂單資訊和使用者資訊的對映 -->
  8.         <!-- 訂單明細資訊  
  9.         一個訂單關聯查詢出了多條明細,要使用collection進行對映  
  10.         collection:對關聯查詢到多條記錄對映到集合物件中  
  11.         property:將關聯查詢到多條記錄對映到cn.itcast.mybatis.po.Orders哪個屬性  
  12.         ofType:指定對映到list集合屬性中pojo的型別  
  13.          -->
  14.          <collectionproperty="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail">
  15.             <!-- id:訂單明細唯 一標識  
  16.             property:要將訂單明細的唯 一標識 對映到cn.itcast.mybatis.po.Orderdetail的哪個屬性  
  17.               -->
  18.             <idcolumn="orderdetail_id"property="id"/>
  19.             <resultcolumn="items_id"property="itemsId"/>
  20.             <resultcolumn="items_num"property="itemsNum"/>
  21.             <resultcolumn="orders_id"property="ordersId"/>
  22.          </collection>
  23.     </resultMap>

在查詢時,雖然一條訂單資訊對應多條訂單明細,由於將多條資訊明細儲存到了list中,因此查詢後將不再出現重複資料,達到了去重的效果