最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis中的resultType和resultMap使用

 更新時(shí)間:2024年09月03日 15:54:28   作者:不能說的秘密go  
這篇文章主要介紹了Mybatis中的resultType和resultMap使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、概述

MyBatis中在查詢進(jìn)行select映射的時(shí)候,返回類型可以用resultType,也可以用resultMap,resultType是直接表示返回類型的,而resultMap則是對(duì)外部ResultMap的引用,但是resultType跟resultMap不能同時(shí)存在。

在MyBatis進(jìn)行查詢映射時(shí),其實(shí)查詢出來的每一個(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ù)雜查詢中很有作用。

二、ResultType

Blog.java

public class Blog {
private int id;
private String title;
private String content;
private String owner;
private List<Comment> comments;
}

其所對(duì)應(yīng)的數(shù)據(jù)庫表中存儲(chǔ)有id、title、content、owner屬性。

(使用resultType也就意外這屬性名必須和列名一致)

<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會(huì)自動(dòng)創(chuàng)建一個(gè)ResultMap對(duì)象,然后基于查找出來的屬性名進(jìn)行鍵值對(duì)封裝,然后再看到返回類型是Blog對(duì)象,再從ResultMap中取出與Blog對(duì)象對(duì)應(yīng)的鍵值對(duì)進(jìn)行賦值。

三、ResultMap

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

先看看一個(gè)返回類型為ResultMap的簡(jiǎn)單查詢,再看看復(fù)雜查詢的用法。

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

<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ù)庫中查詢的屬性,Property則表示查詢出來的屬性對(duì)應(yīng)的值賦給實(shí)體對(duì)象的哪個(gè)屬性。

簡(jiǎn)單查詢的resultMap的寫法就是這樣的。

②復(fù)雜查詢

有一個(gè)Comment類,其中有一個(gè)Blog的引用,表示是對(duì)哪個(gè)Blog的Comment,那么在查詢Comment的時(shí)候把其對(duì)應(yīng)的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>

先是請(qǐng)求id為selectComment的select映射,然后得到一個(gè)id為CommentResult的ResultMap對(duì)象,可以看到在對(duì)應(yīng)的resultMap的返回類型是一個(gè)Comment對(duì)象,其中只有一個(gè)association節(jié)點(diǎn),而沒有像前面說的簡(jiǎn)單查詢所對(duì)應(yīng)的id、result子節(jié)點(diǎn),但是其仍會(huì)把對(duì)應(yīng)的id等屬性賦給Comment對(duì)象,這就是前面所說的MyBatis擁有自動(dòng)封裝功能,只要提供了返回類型,MyBatis會(huì)根據(jù)自己的判斷來利用查詢結(jié)果封裝對(duì)應(yīng)的對(duì)象,所以前面的簡(jiǎn)單查詢中,如果不在resultMap中明確的指出id對(duì)應(yīng)哪個(gè)字段,title對(duì)應(yīng)哪個(gè)字段,MyBatis也會(huì)根據(jù)自身的判斷來幫封裝,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,在上述的寫法中,關(guān)聯(lián)對(duì)象是通過子查詢來進(jìn)行關(guān)聯(lián)的,當(dāng)然也可以直接通過關(guān)聯(lián)查詢來進(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映射來映射對(duì)應(yīng)的關(guān)聯(lián)屬性,即會(huì)去請(qǐng)求id為select所對(duì)應(yīng)的值的select映射 來查詢出其所關(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中查詢出來的blog屬性的值作為參數(shù)傳給進(jìn)行關(guān)聯(lián)對(duì)象blog的子查詢selectBlog的參數(shù);
  • javaType表示當(dāng)前關(guān)聯(lián)對(duì)象在JAVA中是什么類型。

上述介紹的是一對(duì)一或一對(duì)多的情況下,對(duì)一對(duì)一方的關(guān)聯(lián)的查詢。

在實(shí)際應(yīng)用中還有一個(gè)用的比較多的應(yīng)用是通過一對(duì)一方查出對(duì)應(yīng)的多的一方,在拿出多的一方的時(shí)候也同樣要把一對(duì)一方關(guān)聯(lián)上:在拿出Blog對(duì)象時(shí),就把其對(duì)應(yīng)的Comment全部拿出來,在拿出Comment的時(shí)候也還是需要把其對(duì)應(yīng)的Blog拿出來,這是在java中通過一次請(qǐng)求就拿出來的。

來自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>

上述請(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è)子查詢來查詢對(duì)應(yīng)的comments,column表示把上述查出來的哪個(gè)字段值當(dāng)作參數(shù)傳給子查詢,ofType也是表示返回類型,這里的返回類型是集合內(nèi)部的類型,之所以用ofType而不是用type是MyBatis內(nèi)部為了和關(guān)聯(lián)association進(jìn)行區(qū)別。

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JVM完全解讀之YGC來龍去脈分析

    JVM完全解讀之YGC來龍去脈分析

    YGC是JVM?GC當(dāng)前最為頻繁的一種GC,一個(gè)高并發(fā)的服務(wù)在運(yùn)行期間,會(huì)進(jìn)行大量的YGC,發(fā)生YGC時(shí),會(huì)進(jìn)行STW,一般時(shí)間都很短,除非碰到Y(jié)GC時(shí),存在大量的存活對(duì)象需要進(jìn)行拷貝
    2022-01-01
  • 一文詳解springboot中的熱啟動(dòng)配置方案

    一文詳解springboot中的熱啟動(dòng)配置方案

    SpringBoot的熱啟動(dòng)主要通過 **`spring-boot-devtools`** 模塊實(shí)現(xiàn),能在代碼修改后自動(dòng)重啟應(yīng)用,大幅提升開發(fā)效率,下面小編就來和大家講講詳細(xì)配置和使用指南
    2025-07-07
  • Java8 Zip 壓縮與解壓縮的實(shí)現(xiàn)

    Java8 Zip 壓縮與解壓縮的實(shí)現(xiàn)

    這篇文章主要介紹了Java8 Zip 壓縮與解壓縮的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • java中對(duì)象的比較equal、Comparble、Comparator的區(qū)別

    java中對(duì)象的比較equal、Comparble、Comparator的區(qū)別

    本文主要介紹了java中對(duì)象的比較equal、Comparble、Comparator的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 利用synchronized實(shí)現(xiàn)線程同步的案例講解

    利用synchronized實(shí)現(xiàn)線程同步的案例講解

    這篇文章主要介紹了利用synchronized實(shí)現(xiàn)線程同步的案例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java圖書管理系統(tǒng)課程設(shè)計(jì)

    Java圖書管理系統(tǒng)課程設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了Java圖書管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java在原字符中插入新字符或字符串實(shí)例

    java在原字符中插入新字符或字符串實(shí)例

    這篇文章主要介紹了java在原字符中插入新字符或字符串實(shí)例,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Spring中的依賴注入DI源碼詳細(xì)解析

    Spring中的依賴注入DI源碼詳細(xì)解析

    這篇文章主要介紹了Spring中的依賴注入DI源碼詳細(xì)解析,Spring的依賴注入(Dependency Injection,DI)是Spring框架核心的一部分,它是實(shí)現(xiàn)控制反轉(zhuǎn)(Inversion of Control,IoC)的一種方式,需要的朋友可以參考下
    2023-11-11
  • spring security中的csrf防御原理(跨域請(qǐng)求偽造)

    spring security中的csrf防御原理(跨域請(qǐng)求偽造)

    這篇文章主要介紹了spring security中的csrf防御機(jī)制原理解析(跨域請(qǐng)求偽造),本文通過實(shí)例代碼詳解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java判斷一個(gè)字符串是不是純數(shù)字的四種方法

    Java判斷一個(gè)字符串是不是純數(shù)字的四種方法

    在 Java 中,要判斷一個(gè)字符串是否是純數(shù)字(即只包含數(shù)字字符),有幾種常見的方法,這里我們將介紹幾種常見的實(shí)現(xiàn)方式,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2025-05-05

最新評(píng)論

台南县| 龙海市| 安达市| 周口市| 曲阜市| 集安市| 武川县| 亚东县| 精河县| 黄大仙区| 灵川县| 榆林市| 莱芜市| 招远市| 汝城县| 泌阳县| 万年县| 北碚区| 秭归县| 洛宁县| 阳山县| 吉安县| 沽源县| 得荣县| 舒城县| 鄯善县| 当阳市| 斗六市| 新密市| 馆陶县| 舞钢市| 奇台县| 乐平市| 察雅县| 鄂州市| 云林县| 吉安市| 浪卡子县| 文成县| 兴义市| 乌海市|