一、概述
MyBatis中在查詢進行select映射的時候,返回類型可以用resultType,也可以用resultMap,resultType是直接表示返回類型的,而resultMap則是對外部ResultMap的引用,但是resultType跟resultMap不能同時存在。
在MyBatis進行查詢映射時,其實查詢出來的每一個屬性都是放在一個對應的Map里面的,其中鍵是屬性名,值則是其對應的值。
①當提供的返回類型屬性是resultType時,MyBatis會將Map里面的鍵值對取出賦給resultType所指定的對象對應的屬性。所以其實MyBatis的每一個查詢映射的返回類型都是ResultMap,只是當提供的返回類型屬性是resultType的時候,MyBatis對自動的給把對應的值賦給resultType所指定對象的屬性。
②當提供的返回類型是resultMap時,因為Map不能很好表示領域模型,就需要自己再進一步的把它轉化為對應的對象,這常常在復雜查詢中很有作用。
二、ResultType
Blog.java
- public class Blog {
- private int id;
- private String title;
- private String content;
- private String owner;
- private List<Comment> comments;
- }
其所對應的數據庫表中存儲有id、title、Content、Owner屬性。
- <typeAlias alias="Blog" type="com.tiantian.mybatis.model.Blog"/>
- <select id="selectBlog" parameterType="int" resultType="Blog">
- select * from t_blog where id = #{id}
- </select>
MyBatis會自動創建一個ResultMap對象,然后基於查找出來的屬性名進行鍵值對封裝,然后再看到返回類型是Blog對象,再從ResultMap中取出與Blog對象對應的鍵值對進行賦值。
三、ResultMap
當返回類型直接是一個ResultMap的時候也是非常有用的,這主要用在進行復雜聯合查詢上,因為進行簡單查詢是沒有什么必要的。先看看一個返回類型為ResultMap的簡單查詢,再看看復雜查詢的用法。
①簡單查詢的寫法
- <resultMap type="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>
select映射中resultMap的值是一個外部resultMap的id,表示返回結果映射到哪一個resultMap上,外部resultMap的type屬性表示該resultMap的結果是一個什么樣的類型,這里是Blog類型,那么MyBatis就會把它當作一個Blog對象取出。resultMap節點的子節點id是用於標識該對象的id的,而result子節點則是用於標識一些簡單屬性的,其中的Column屬性表示從數據庫中查詢的屬性,Property則表示查詢出來的屬性對應的值賦給實體對象的哪個屬性。簡單查詢的resultMap的寫法就是這樣的。