mybatis初步----查詢之resultMap和resultType

MyBatis的每個查詢映射的返回類型都是ResultMap,只是當咱們提供的返回類型屬性是resultType的時候,MyBatis對自動的給咱們把對應的值賦給resultType所指定對象的屬性,而當咱們提供的返回類型是resultMap的時候,將數據庫中列數據複製到對象的相應屬性上,能夠用於複製查詢,二者不能同時用。 java

一、resultType 數據庫

返回單個實例 app

<select id="selectUser" parameterType="int" resultType="User"> spa

select * from user where id = #{id} xml

</select>
返回List集合 對象

<select id="selectUserAll" resultType="User" > <!-- resultMap="userMap" -->
select * from user
</select>
blog

二、resultMap ci

簡單查詢: it

<resultMap type="User" id="userMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
</resultMap>
column:數據庫中列名稱,property:類中屬性名稱 io

複製查詢:如下轉自:http://haohaoxuexi.iteye.com/blog/1337009

Xml代碼   收藏代碼
  1. <!--來自CommentMapper.xml文件    -->  
  2.     <resultMap type="Comment" id="CommentResult">  
  3.         <association property="blog" select="selectBlog" column="blog" javaType="Blog"/>  
  4.     </resultMap>  
  5.       
  6.     <select id="selectComment" parameterType="int" resultMap="CommentResult">  
  7.         select * from t_Comment where id = #{id}  
  8.     </select>  
  9.       
  10.     <select id="selectBlog" parameterType="int" resultType="Blog">  
  11.         select * from t_Blog where id = #{id}  
  12.     </select>  

其訪問狀況是這樣的,先是請求id爲selectComment的select映射,而後獲得一個id爲CommentResult的 ResultMap對象,咱們能夠看到在對應的resultMap的返回類型是一個Comment對象,其中只有一個association節點,而沒有 像前面說的簡單查詢所對應的id,result子節點,可是其仍會把對應的id等屬性賦給Comment對象,這就是前面所說的MyBatis擁有自動封 裝功能,只要你提供了返回類型,MyBatis會根據本身的判斷來利用查詢結果封裝對應的對象,因此前面的簡單查詢中,若是你不在resultMap中明 確的指出id對應哪一個字段,title對應哪一個字段,MyBatis也會根據自身的判斷來幫你封裝,MyBatis的自身判斷是把查詢的field或其對 應的別名與返回對象的屬性進行比較,若是相匹配且類型也相匹配,MyBatis則會對其進行賦值。在上面對應的resultMap中關聯了一個blog屬 性,其對應的JAVA類型爲Blog,在上述的寫法中,關聯對象是經過子查詢來進行關聯的,固然也能夠直接經過關聯查詢來進行關聯。上面的 association子節點中,Property屬性表示是resultMap返回類型的哪一個關聯屬性,對於上面的例子就是Comment管理的 blog屬性;select表示進行哪一個select映射來映射對應的關聯屬性,即會去請求id爲select所對應的值的select映射 來查詢出其所關聯的屬性對象;Column表示當前關聯對象在id爲CommentResult的resultMap中所對應的鍵值對,該鍵值對將做爲對 關聯對象子查詢的參數,即將把在selectComment中查詢出來的blog屬性的值做爲參數傳給進行關聯對象blog的子查詢selectBlog 的參數;javaType表示當前關聯對象在JAVA中是什麼類型。

 

上述介紹的是一對一或一對多的狀況下,對一的一方的關聯的查詢。在實際應用中還有一個用的比較多的應用是經過一的一方查出對應的多的一方,在拿出多 的一方的時候也一樣要把一的一方關聯上,即在上述例子中,在拿出Blog對象的時候,就把其對應的Comment所有拿出來,在拿出Comment的時候 也仍是須要把其對應的Blog拿出來,這是在JAVA中經過一次請求就拿出來的。寫法以下:

 

Xml代碼   收藏代碼
  1. <!-- 來自BlogMapper.xml文件 -->  
  2.     <resultMap type="Blog" id="BlogResult">  
  3.         <id column="id" property="id"/>  
  4.         <collection property="comments" select="selectCommentsByBlog" column="id" ofType="Comment"></collection>  
  5.     </resultMap>  
  6.   
  7.     <resultMap type="Comment" id="CommentResult">  
  8.         <association property="blog" javaType="Blog" column="blog" select="selectBlog"/>  
  9.     </resultMap>  
  10.   
  11.     <select id="selectBlog" parameterType="int" resultMap="BlogResult">  
  12.         select * from t_blog where id = #{id}  
  13.     </select>  
  14.   
  15. <!--  經過Blog來查找Comment   -->  
  16.     <select id="selectCommentsByBlog" parameterType="int" resultMap="CommentResult">  
  17.         select * from t_Comment where blog = #{blogId}  
  18.     </select>  

上述請求的入口是id爲selectBlog的select映射,返回結果爲id爲BlogResult的resultMap,id爲 BlogResult的類型爲Blog,其中指定了id的屬性和字段,指定id將對MyBatis內部的構造做用很是大。其中關聯了一個comments 對象,由於一個Blog能夠有不少Comment,該comments爲一個集合,因此用集合collection進行映射,其中的select仍是表示 進行哪一個子查詢來查詢對應的comments,column表示把上述查出來的哪一個字段值看成參數傳給子查詢,ofType也是表示返回類型,這裏的返回 類型是集合內部的類型,之因此用ofType而不是用type是MyBatis內部爲了和關聯association進行區別。 

相關文章
相關標籤/搜索