程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 深刻懂得Mybatis中的resultType和resultMap

深刻懂得Mybatis中的resultType和resultMap

編輯:關於JAVA

深刻懂得Mybatis中的resultType和resultMap。本站提示廣大學習愛好者:(深刻懂得Mybatis中的resultType和resultMap)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻懂得Mybatis中的resultType和resultMap正文


 1、概述

MyBatis中在查詢停止select映照的時刻,前往類型可以用resultType,也能夠用resultMap,resultType是直接表現前往類型的,而resultMap則是對內部ResultMap的援用,然則resultType跟resultMap不克不及同時存在。

在MyBatis停止查詢映照時,其實查詢出來的每個屬性都是放在一個對應的Map外面的,個中鍵是屬性名,值則是其對應的值。

①當供給的前往類型屬性是resultType時,MyBatis會將Map外面的鍵值對掏出賦給resultType所指定的對象對應的屬性。所以其實MyBatis的每個查詢映照的前往類型都是ResultMap,只是
當供給的前往類型屬性是resultType的時刻,MyBatis對主動的給把對應的值賦給resultType所指定對象的屬性。

②當供給的前往類型是resultMap時,由於Map不克不及很好表現范疇模子,就須要本身再進一步的把它轉化為對應的對象,這經常在龐雜查詢中很有感化。

2、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對象對應的鍵值對停止賦值。

3、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的寫法就是如許的。

②龐雜查詢

有一個Comment類,個中有一個Blog的援用,表現是對哪一個Blog的Comment,那末在查詢Comment的時刻把其對應的Blog也要查出來賦給其blog屬性。

public class Comment {
private int id;
private String content;
private Date commentDate = new Date();
private Blog blog;
}
<!--來自CommentMapper.xml文件-->
<resultMap type="Comment" id="CommentResult">
<association property="blog" select="selectBlog" column="blog" javaType="Blog"/>
</resultMap>
<select id="selectComment" parameterType="int" resultMap="CommentResult">
select * from t_Comment where id = #{id}
</select>
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from t_Blog where id = #{id}
</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中經由過程一次要求就拿出來的。

<!-- 來自BlogMapper.xml文件 -->
<resultMap type="Blog" id="BlogResult">
<id column="id" property="id"/>
<collection property="comments" select="selectCommentsByBlog" column="id" ofType="Comment"></collection>
</resultMap>
<resultMap type="Comment" id="CommentResult">
<association property="blog" javaType="Blog" column="blog" select="selectBlog"/>
</resultMap>
<select id="selectBlog" parameterType="int" resultMap="BlogResult">
select * from t_blog where id = #{id}
</select>
<select id="selectCommentsByBlog" parameterType="int" resultMap="CommentResult">
select * from t_Comment where blog = #{blogId}
</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停止差別。

public void selectCommentsByBlogTest() {
SqlSession session = Util.getSqlSessionFactory().openSession();
CommentMapper commentMapper = session.getMapper(CommentMapper.class);
List<Comment> comments = commentMapper.selectCommentsByBlog(6);
for (Comment comment : comments)
System.out.println(comment);
session.close();
}
public void testSelectOne() {
SqlSession session = Util.getSqlSessionFactory().openSession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class);
Blog blog = blogMapper.selectBlog(6);
List<Comment> comments = blog.getComments();
if (comments != null) {
for (Comment comment : comments)
System.out.println(comment);
}
session.close();
}

以上所述是小編給年夜家引見的Mybatis中的resultType和resultMap,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved