亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis中的resultMap簡要概述

 更新時間:2016年07月01日 16:43:25   投稿:mrr  
這篇文章主要介紹了MyBatis中的resultMap簡要概述的相關(guān)資料,需要的朋友可以參考下

Mybatis簡介

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

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

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

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

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

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

有這樣一個Blog.java文件

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;
}
}

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

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

MyBatis會自動創(chuàng)建一個ResultMap對象,然后基于查找出來的屬性名進行鍵值對封裝,然后再看到返回類型是Blog對象,再從ResultMap中取出與Blog對象對應(yīng)的鍵值對進行賦值。

當(dāng)返回類型直接是一個ResultMap的時候也是非常有用的,這主要用在進行復(fù)雜聯(lián)合查詢上,因為進行簡單查詢是沒有什么必要的。我們先看看一個返回類型為ResultMap的簡單查詢,再看看復(fù)雜查詢的用法。

簡單查詢的寫法

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

有一個Comment類,其中有一個Blog的引用,表示是對哪個Blog的Comment,那么我們在查詢Comment的時候把其對應(yīng)的Blog也要查出來賦給其blog屬性。

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 ----------------評論-----------------\n id: " + id + "\n content: " + content + "\n commentDate: " + commentDate;
}
}

其寫法是這樣的

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

上述介紹的是一對一或一對多的情況下,對一的一方的關(guān)聯(lián)的查詢。在實際應(yīng)用中還有一個用的比較多的應(yīng)用是通過一的一方查出對應(yīng)的多的一方,在拿出多的一方的時候也同樣要把一的一方關(guān)聯(lián)上,即在上述例子中,在拿出Blog對象的時候,就把其對應(yīng)的Comment全部拿出來,在拿出Comment的時候也還是需要把其對應(yīng)的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>
<!-- 通過Blog來查找Comment -->
<select id="selectCommentsByBlog" parameterType="int" resultMap="CommentResult">
select * from t_Comment where blog = #{blogId}
</select>

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

測試代碼:

@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簡要概述,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 從底層源碼深入分析Spring的IoC容器的實現(xiàn)原理

    從底層源碼深入分析Spring的IoC容器的實現(xiàn)原理

    IoC容器負(fù)責(zé)管理對象的生命周期和依賴關(guān)系,大大簡化了應(yīng)用程序的開發(fā)和維,我們這篇文章將會從底層源碼的角度深入分析Spring的IoC容器實現(xiàn),探索它的工作原理和關(guān)鍵組件,需要的朋友可以參考下
    2023-07-07
  • 詳解SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類型

    詳解SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類型

    本文主要介紹了SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類型,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • java 中Buffer源碼的分析

    java 中Buffer源碼的分析

    這篇文章主要介紹了java 中Buffer源碼的分析的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Springboot集成swagger實現(xiàn)方式

    Springboot集成swagger實現(xiàn)方式

    這篇文章主要介紹了Springboot集成swagger實現(xiàn)方式,通過簡單的示例代碼詳細(xì)描述了實現(xiàn)過程步驟,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-08-08
  • Spring?Cloud整合XXL-Job的示例代碼

    Spring?Cloud整合XXL-Job的示例代碼

    這篇文章主要介紹了springcloud整合xxl-job的示例代碼,主要分為四個過程,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 關(guān)于log4j2的異步日志輸出方式

    關(guān)于log4j2的異步日志輸出方式

    這篇文章主要介紹了關(guān)于log4j2的異步日志輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • LCN分布式事務(wù)解決方案詳解

    LCN分布式事務(wù)解決方案詳解

    這篇文章主要介紹了LCN分布式事務(wù)解決方案詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java使用Jedis操作Redis服務(wù)器的實例代碼

    Java使用Jedis操作Redis服務(wù)器的實例代碼

    本篇文章主要介紹了Java使用Jedis操作Redis服務(wù)器的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • mybatis的if判斷不要使用boolean值的說明

    mybatis的if判斷不要使用boolean值的說明

    這篇文章主要介紹了mybatis的if判斷不要使用boolean值的說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • springBoot?之spring.factories擴展機制示例解析

    springBoot?之spring.factories擴展機制示例解析

    這篇文章主要為大家介紹了springBoot?之spring.factories擴展機制示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04

最新評論