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程式碼- <select id="count" parameterType="AreaDto" resultType="java.lang.Integer">
- SELECT id FROM USER
- </select>
返回一個int
Xml程式碼-
<select id="count" parameterType="AreaDto" resultType="java.lang.Integer"
- SELECT count(*) FROM USER
- </select>
返回map
Xml程式碼- <select id=”selectUsers” parameterType=”int” resultType=”hashmap”>
- select id, username, hashedPassword
- from some_table
- where id = #{id}
- </select>
這樣一個語句簡單作用於所有列被自動對映到HashMap的鍵上,這由resultType屬性指定。這在很多情況下是有用的,但是HashMap不能很好描述一個領域模型。那樣你的應用程式將會使用JavaBeans或POJOs(Plain Old
返回javaBEAN 物件
Xml程式碼- <select id="count" parameterType="AreaDto" resultType="User">
- SELECT * FROM USER
- </select>
要記住類型別名是你的夥伴。使用它們你可以不用輸入類的全路徑。
Xml程式碼- <typeAlias type=”com.someapp.model.User” alias=”User”/>
這些情況下,MyBatis會在幕後自動建立一個ResultMap,基於屬性名來對映列到JavaBean的屬性上
2.resultMap
MyBatis會自動建立一個ResultMap物件,然後基於查找出來的屬性名進行鍵值對封裝,然後再看到返回型別是Blog物件,再從ResultMap中取出與Blog物件對應的鍵值對進行賦值。
當返回型別直接是一個ResultMap的時候也是非常有用的,這主要用在進行復雜聯合查詢上,因為進行簡單查詢是沒有什麼必要的。
簡單resultMap配置
Xml程式碼- <resultMap type="com.liulanghan.Blog" id="BlogResult">
- <id column="id" property="id"/>
- <result column="title" property="title"/>
- <result column="content" property="content"/>
- <result column="owner" property="owner"/>
- </resultMap>
- <select id="selectBlog" parameterType="int" resultMap="BlogResult">
- select * from t_blog where id = #{id}
- </select>
結果集的列比resultMap多會報錯麼?
不會,只對映resultMap中有的列。
結果集的列比resultMap少會報錯麼?
不會,只對映結果集中有的列。
resultType | 語句返回值型別的整類名或別名。注意,如果是集合,那麼這裡填寫的是集合的項的整類名或別名,而不是集合本身的類名。(resultType 與resultMap 不能並用) |
resultMap | 引用的外部resultMap 名。結果集對映是MyBatis 中最強大的特性。許多複雜的對映都可以輕鬆解決。(resultType 與resultMap 不能並用) |