1. 程式人生 > >Mybatis中resultMap和resultType使用聯絡與區別

Mybatis中resultMap和resultType使用聯絡與區別



        MyBatis中在查詢進行select對映的時候,返回型別可以用resultType,也可以用resultMap,resultType是直接


 表示返回型別的,而resultMap則是對外部ResultMap的引用,但是resultType跟resultMap不能同時存在

1.resultType

在MyBatis進行查詢對映的時候,其實查詢出來的每一個屬性都是放在一個對應的Map裡面的,其中鍵是屬性名,
值則是其對應的值。當提供的返回型別屬性是resultType的時候,MyBatis會將Map裡面的鍵值對取出賦給
resultType所指定的物件對應的屬性。所以其實MyBatis的每一個查詢對映的返回型別都是ResultMap,
只是當我們提供的返回型別屬性是resultType的時候,MyBatis對自動的給我們把對應的值賦給resultType
所指定物件的屬性,而當我們提供的返回型別是resultMap的時候,因為Map不能很好表示領域模型,
我們就需要自己再進一步的把它轉化為對應的物件,這常常在複雜查詢中很有作用。

這裡要強調的是,Mybatis是對返回的結果的每一行做對映的。所以,下面的語句返回的是Integer,而不是List

Xml程式碼  收藏程式碼
  1. <select id="count" parameterType="AreaDto" resultType="java.lang.Integer">  
  2.         SELECT id FROM USER  
  3. </select>  

返回一個int

Xml程式碼  收藏程式碼
  1. <select id="count" parameterType="AreaDto" resultType="java.lang.Integer"
    >  
  2.         SELECT count(*) FROM USER  
  3. </select>  

返回map

Xml程式碼  收藏程式碼
  1. <select id=”selectUsers” parameterType=”int” resultType=”hashmap”>  
  2.     select id, username, hashedPassword  
  3.     from some_table  
  4.     where id = #{id}  
  5. </select>  

這樣一個語句簡單作用於所有列被自動對映到HashMap的鍵上,這由resultType屬性指定。這在很多情況下是有用的,但是HashMap不能很好描述一個領域模型。那樣你的應用程式將會使用JavaBeans或POJOs(Plain Old

Java Objects,普通Java物件)來作為領域模型

返回javaBEAN 物件

Xml程式碼  收藏程式碼
  1. <select id="count" parameterType="AreaDto" resultType="User">  
  2.         SELECT * FROM USER  
  3. </select>   

要記住類型別名是你的夥伴。使用它們你可以不用輸入類的全路徑。

Xml程式碼  收藏程式碼
  1. <typeAlias type=”com.someapp.model.User” alias=”User”/>  

 這些情況下,MyBatis會在幕後自動建立一個ResultMap,基於屬性名來對映列到JavaBean的屬性上

 2.resultMap

MyBatis會自動建立一個ResultMap物件,然後基於查找出來的屬性名進行鍵值對封裝,然後再看到返回型別是Blog物件,再從ResultMap中取出與Blog物件對應的鍵值對進行賦值。

當返回型別直接是一個ResultMap的時候也是非常有用的,這主要用在進行復雜聯合查詢上,因為進行簡單查詢是沒有什麼必要的。

簡單resultMap配置 

Xml程式碼  收藏程式碼
  1. <resultMap type="com.liulanghan.Blog" id="BlogResult">    
  2.     <id column="id" property="id"/>    
  3.     <result column="title" property="title"/>    
  4.     <result column="content" property="content"/>    
  5.     <result column="owner" property="owner"/>    
  6. </resultMap>   
  7. <select id="selectBlog" parameterType="int" resultMap="BlogResult">    
  8.       select * from t_blog where id = #{id}    
  9. </select>  

結果集的列比resultMap多會報錯麼?
不會,只對映resultMap中有的列。

結果集的列比resultMap少會報錯麼?
不會,只對映結果集中有的列。

resultType                                        語句返回值型別的整類名或別名。注意,如果是集合,那麼這裡填寫的是集合的項的整類名或別名,而不是集合本身的類名。(resultType 與resultMap 不能並用
resultMap 引用的外部resultMap 名。結果集對映是MyBatis 中最強大的特性。許多複雜的對映都可以輕鬆解決。(resultType 與resultMap 不能並用)