激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - MyBatis中的resultMap簡(jiǎn)要概述

MyBatis中的resultMap簡(jiǎn)要概述

2020-05-23 14:38MRR JAVA教程

這篇文章主要介紹了MyBatis中的resultMap簡(jiǎn)要概述的相關(guān)資料,需要的朋友可以參考下

Mybatis簡(jiǎn)介

MyBatis中的resultMap簡(jiǎn)要概述

MyBatis是一個(gè)支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及對(duì)結(jié)果集的檢索封裝。MyBatis可以使用簡(jiǎn)單的XML或注解用于配置和原始映射,將接口和Java的POJO(Plain Old Java Objects,普通的Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。

Mybatis的功能架構(gòu)分為三層(圖片借用了百度百科):

1)       API接口層:提供給外部使用的接口API,開(kāi)發(fā)人員通過(guò)這些本地API來(lái)操縱數(shù)據(jù)庫(kù)。接口層一接收到調(diào)用請(qǐng)求就會(huì)調(diào)用數(shù)據(jù)處理層來(lái)完成具體的數(shù)據(jù)處理。

2)       數(shù)據(jù)處理層:負(fù)責(zé)具體的SQL查找、SQL解析、SQL執(zhí)行和執(zhí)行結(jié)果映射處理等。它主要的目的是根據(jù)調(diào)用的請(qǐng)求完成一次數(shù)據(jù)庫(kù)操作。

3)      基礎(chǔ)支撐層:負(fù)責(zé)最基礎(chǔ)的功能支撐,包括連接管理、事務(wù)管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來(lái)作為最基礎(chǔ)的組件。為上層的數(shù)據(jù)處理層提供最基礎(chǔ)的支撐。

MyBatis中的resultMap簡(jiǎn)要概述

MyBatis中在查詢進(jìn)行select映射的時(shí)候,返回類型可以用resultType,也可以用resultMap,resultType是直接表示返回類型的,而resultMap則是對(duì)外部ResultMap的引用,但是resultType跟resultMap不能同時(shí)存在。在MyBatis進(jìn)行查詢映射的時(shí)候,其實(shí)查詢出來(lái)的每一個(gè)屬性都是放在一個(gè)對(duì)應(yīng)的Map里面的,其中鍵是屬性名,值則是其對(duì)應(yīng)的值。當(dāng)提供的返回類型屬性是resultType的時(shí)候,MyBatis會(huì)將Map里面的鍵值對(duì)取出賦給resultType所指定的對(duì)象對(duì)應(yīng)的屬性。所以其實(shí)MyBatis的每一個(gè)查詢映射的返回類型都是ResultMap,只是當(dāng)我們提供的返回類型屬性是resultType的時(shí)候,MyBatis對(duì)自動(dòng)的給我們把對(duì)應(yīng)的值賦給resultType所指定對(duì)象的屬性,而當(dāng)我們提供的返回類型是resultMap的時(shí)候,因?yàn)镸ap不能很好表示領(lǐng)域模型,我們就需要自己再進(jìn)一步的把它轉(zhuǎn)化為對(duì)應(yīng)的對(duì)象,這常常在復(fù)雜查詢中很有作用。

有這樣一個(gè)Blog.java文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.List;
public class Blog {
private int id;
private String title;
private String content;
private String owner;
 
private List<Comment> comments;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
 
public List<Comment> getComments() {
return comments;
}
 
public void setComments(List<Comment> comments) {
this.comments = comments;
}
@Override
public String toString() {
return " ----------------博客-----------------\n id: " + id + "\n title: " + title + "\n content: " + content
+ "\n owner: " + owner;
}
}

其所對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中存儲(chǔ)有id,title,Content,Owner屬性,那么當(dāng)我們進(jìn)行下面這樣一個(gè)查詢映射的時(shí)候

?
1
2
3
4
<typeAlias alias="Blog" type="com.tiantian.mybatis.model.Blog"/><!--來(lái)自MyBatis的配置文件mybatis_config.xml-->
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from t_blog where id = #{id}
</select><!--來(lái)自SQL映射文件BlogMapper.xml-->

MyBatis會(huì)自動(dòng)創(chuàng)建一個(gè)ResultMap對(duì)象,然后基于查找出來(lái)的屬性名進(jìn)行鍵值對(duì)封裝,然后再看到返回類型是Blog對(duì)象,再?gòu)腞esultMap中取出與Blog對(duì)象對(duì)應(yīng)的鍵值對(duì)進(jìn)行賦值。

當(dāng)返回類型直接是一個(gè)ResultMap的時(shí)候也是非常有用的,這主要用在進(jìn)行復(fù)雜聯(lián)合查詢上,因?yàn)檫M(jìn)行簡(jiǎn)單查詢是沒(méi)有什么必要的。我們先看看一個(gè)返回類型為ResultMap的簡(jiǎn)單查詢,再看看復(fù)雜查詢的用法。

簡(jiǎn)單查詢的寫(xiě)法

?
1
2
3
4
5
6
7
8
9
<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的值是一個(gè)外部resultMap的id,表示返回結(jié)果映射到哪一個(gè)resultMap上,外部resultMap的type屬性表示該resultMap的結(jié)果是一個(gè)什么樣的類型,這里是Blog類型,那么MyBatis就會(huì)把它當(dāng)作一個(gè)Blog對(duì)象取出。resultMap節(jié)點(diǎn)的子節(jié)點(diǎn)id是用于標(biāo)識(shí)該對(duì)象的id的,而result子節(jié)點(diǎn)則是用于標(biāo)識(shí)一些簡(jiǎn)單屬性的,其中的Column屬性表示從數(shù)據(jù)庫(kù)中查詢的屬性,Property則表示查詢出來(lái)的屬性對(duì)應(yīng)的值賦給實(shí)體對(duì)象的哪個(gè)屬性。簡(jiǎn)單查詢的resultMap的寫(xiě)法就是這樣的。接下來(lái)看一個(gè)復(fù)雜一點(diǎn)的查詢。

有一個(gè)Comment類,其中有一個(gè)Blog的引用,表示是對(duì)哪個(gè)Blog的Comment,那么我們?cè)诓樵僀omment的時(shí)候把其對(duì)應(yīng)的Blog也要查出來(lái)賦給其blog屬性。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.Date;
public class Comment {
private int id;
private String content;
private Date commentDate = new Date();
private Blog blog;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getCommentDate() {
return commentDate;
}
public void setCommentDate(Date commentDate) {
this.commentDate = commentDate;
}
public Blog getBlog() {
return blog;
}
public void setBlog(Blog blog) {
this.blog = blog;
}
public String toString() {
return blog + "\n ----------------評(píng)論-----------------\n id: " + id + "\n content: " + content + "\n commentDate: " + commentDate;
}
}

其寫(xiě)法是這樣的

?
1
2
3
4
5
6
7
8
9
10
<!--來(lái)自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>

其訪問(wèn)情況是這樣的,先是請(qǐng)求id為selectComment的select映射,然后得到一個(gè)id為CommentResult的ResultMap對(duì)象,我們可以看到在對(duì)應(yīng)的resultMap的返回類型是一個(gè)Comment對(duì)象,其中只有一個(gè)association節(jié)點(diǎn),而沒(méi)有像前面說(shuō)的簡(jiǎn)單查詢所對(duì)應(yīng)的id,result子節(jié)點(diǎn),但是其仍會(huì)把對(duì)應(yīng)的id等屬性賦給Comment對(duì)象,這就是前面所說(shuō)的MyBatis擁有自動(dòng)封裝功能,只要你提供了返回類型,MyBatis會(huì)根據(jù)自己的判斷來(lái)利用查詢結(jié)果封裝對(duì)應(yīng)的對(duì)象,所以前面的簡(jiǎn)單查詢中,如果你不在resultMap中明確的指出id對(duì)應(yīng)哪個(gè)字段,title對(duì)應(yīng)哪個(gè)字段,MyBatis也會(huì)根據(jù)自身的判斷來(lái)幫你封裝,MyBatis的自身判斷是把查詢的field或其對(duì)應(yīng)的別名與返回對(duì)象的屬性進(jìn)行比較,如果相匹配且類型也相匹配,MyBatis則會(huì)對(duì)其進(jìn)行賦值。在上面對(duì)應(yīng)的resultMap中關(guān)聯(lián)了一個(gè)blog屬性,其對(duì)應(yīng)的JAVA類型為Blog,在上述的寫(xiě)法中,關(guān)聯(lián)對(duì)象是通過(guò)子查詢來(lái)進(jìn)行關(guān)聯(lián)的,當(dāng)然也可以直接通過(guò)關(guān)聯(lián)查詢來(lái)進(jìn)行關(guān)聯(lián)。上面的association子節(jié)點(diǎn)中,Property屬性表示是resultMap返回類型的哪個(gè)關(guān)聯(lián)屬性,對(duì)于上面的例子就是Comment管理的blog屬性;select表示進(jìn)行哪個(gè)select映射來(lái)映射對(duì)應(yīng)的關(guān)聯(lián)屬性,即會(huì)去請(qǐng)求id為select所對(duì)應(yīng)的值的select映射 來(lái)查詢出其所關(guān)聯(lián)的屬性對(duì)象;Column表示當(dāng)前關(guān)聯(lián)對(duì)象在id為CommentResult的resultMap中所對(duì)應(yīng)的鍵值對(duì),該鍵值對(duì)將作為對(duì)關(guān)聯(lián)對(duì)象子查詢的參數(shù),即將把在selectComment中查詢出來(lái)的blog屬性的值作為參數(shù)傳給進(jìn)行關(guān)聯(lián)對(duì)象blog的子查詢selectBlog的參數(shù);javaType表示當(dāng)前關(guān)聯(lián)對(duì)象在JAVA中是什么類型。

上述介紹的是一對(duì)一或一對(duì)多的情況下,對(duì)一的一方的關(guān)聯(lián)的查詢。在實(shí)際應(yīng)用中還有一個(gè)用的比較多的應(yīng)用是通過(guò)一的一方查出對(duì)應(yīng)的多的一方,在拿出多的一方的時(shí)候也同樣要把一的一方關(guān)聯(lián)上,即在上述例子中,在拿出Blog對(duì)象的時(shí)候,就把其對(duì)應(yīng)的Comment全部拿出來(lái),在拿出Comment的時(shí)候也還是需要把其對(duì)應(yīng)的Blog拿出來(lái),這是在JAVA中通過(guò)一次請(qǐng)求就拿出來(lái)的。寫(xiě)法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 來(lái)自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>
<!-- 通過(guò)Blog來(lái)查找Comment -->
<select id="selectCommentsByBlog" parameterType="int" resultMap="CommentResult">
select * from t_Comment where blog = #{blogId}
</select>

上述請(qǐng)求的入口是id為selectBlog的select映射,返回結(jié)果為id為BlogResult的resultMap,id為BlogResult的類型為Blog,其中指定了id的屬性和字段,指定id將對(duì)MyBatis內(nèi)部的構(gòu)造作用非常大。其中關(guān)聯(lián)了一個(gè)comments對(duì)象,因?yàn)橐粋€(gè)Blog可以有很多Comment,該comments為一個(gè)集合,所以用集合collection進(jìn)行映射,其中的select還是表示進(jìn)行哪個(gè)子查詢來(lái)查詢對(duì)應(yīng)的comments,column表示把上述查出來(lái)的哪個(gè)字段值當(dāng)作參數(shù)傳給子查詢,ofType也是表示返回類型,這里的返回類型是集合內(nèi)部的類型,之所以用ofType而不是用type是MyBatis內(nèi)部為了和關(guān)聯(lián)association進(jìn)行區(qū)別。

測(cè)試代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Test
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();
}
/**
* 查詢單條記錄
*/
@Test
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) {
System.out.println("--------------Comments Size------------" + comments.size());
for (Comment comment : comments)
System.out.println(comment);
}
session.close();
}

以上所述是小編給大家介紹的MyBatis中的resultMap簡(jiǎn)要概述,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色柚视频网站ww色 | 国产深夜福利视频在线播放 | 伊人在线| 欧美在线综合视频 | 国产精品hd免费观看 | 亚洲婷婷日日综合婷婷噜噜噜 | 国产精品久久久久久久娇妻 | 2019中文字幕在线播放 | 国产成人精品区一区二区不卡 | 久久久久在线观看 | 午夜久久电影 | 成人情欲视频在线看免费 | 毛片一区二区三区四区 | 中国杭州少妇xxxx做受 | 免费看成人av | 中文字幕在线视频网站 | 一级做受毛片免费大片 | 日日久视频 | 国产麻豆交换夫妇 | 亚洲啊v在线观看 | 国产乱色精品成人免费视频 | 国产午夜精品一区二区三区不卡 | 国产一区二区精品91 | 久久亚洲精选 | 97香蕉超级碰碰久久免费软件 | 欧美一区黄色 | 91精品成人福利在线播放 | 午夜视频导航 | 欧美高清第一页 | a级黄色片视频 | 老女人碰碰在线碰碰视频 | 欧美高清在线精品一区二区不卡 | 亚洲二区不卡 | 国产美女白浆 | 国产精品久久久久免费视频 | 亚洲一级成人 | 免费在线观看成年人视频 | 国产精选在线 | 久久精品亚洲成在人线av网址 | av免费在线网 | 天天鲁在线视频免费观看 |