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和相應表字段的對應。

 

[java]  view plain  copy
 
  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節點元素進行對另一個表的連接處理。例如:

 

[html]  view plain  copy
 
  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.           
  16.         <!-- 配置映射的關聯的用戶信息 -->  
  17.         <!-- association:用於映射關聯查詢單個對象的信息  
  18.         property:要將關聯查詢的用戶信息映射到Orders中哪個屬性  
  19.          -->  
  20.         <association property="user"  javaType="cn.itcast.mybatis.po.User">  
  21.             <!-- id:關聯查詢用戶的唯 一標識  
  22.             column:指定唯 一標識用戶信息的列  
  23.             javaType:映射到user的哪個屬性  
  24.              -->  
  25.             <id column="user_id" property="id"/>  
  26.             <result column="username" property="username"/>  
  27.             <result column="sex" property="sex"/>  
  28.             <result column="address" property="address"/>  
  29.           
  30.         </association>  
  31.     </resultMap>  


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

 

resultMap的處理方式為在訂單表數據的pojo中添加一個list,list中為訂單明細表的屬性,在mapper.xml中采用如下的處理方式:

 

[html]  view plain  copy
 
  1. !-- 訂單及訂單明細的resultMap  
  2.     使用extends繼承,不用在中配置訂單信息和用戶信息的映射  
  3.      -->  
  4.     <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">  
  5.         <!-- 訂單信息 -->  
  6.         <!-- 用戶信息 -->  
  7.         <!-- 使用extends繼承,不用在中配置訂單信息和用戶信息的映射 -->  
  8.           
  9.           
  10.         <!-- 訂單明細信息  
  11.         一個訂單關聯查詢出了多條明細,要使用collection進行映射  
  12.         collection:對關聯查詢到多條記錄映射到集合對象中  
  13.         property:將關聯查詢到多條記錄映射到cn.itcast.mybatis.po.Orders哪個屬性  
  14.         ofType:指定映射到list集合屬性中pojo的類型  
  15.          -->  
  16.          <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">  
  17.             <!-- id:訂單明細唯 一標識  
  18.             property:要將訂單明細的唯 一標識 映射到cn.itcast.mybatis.po.Orderdetail的哪個屬性  
  19.               -->  
  20.             <id column="orderdetail_id" property="id"/>  
  21.             <result column="items_id" property="itemsId"/>  
  22.             <result column="items_num" property="itemsNum"/>  
  23.             <result column="orders_id" property="ordersId"/>  
  24.          </collection>  
  25.           
  26.       
  27.     </resultMap>  


在查詢時,雖然一條訂單信息對應多條訂單明細,由於將多條信息明細存儲到了list中,因此查詢后將不再出現重復數據,達到了去重的效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM