日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mybatis返回map键值对_mybatis返回map结果集怎么配置

發布時間:2025/4/5 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis返回map键值对_mybatis返回map结果集怎么配置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

匿名用戶

1級

2018-06-10 回答

一、概述

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

在MyBatis進行查詢映射時,其實查詢出來的每一個屬性都是放在一個對應的Map里面的,其中鍵是屬性名,值則是其對應的值。

①當提供的返回類型屬性是resultType時,MyBatis會將Map里面的鍵值對取出賦給resultType所指定的對象對應的屬性。所以其實MyBatis的每一個查詢映射的返回類型都是ResultMap,只是當提供的返回類型屬性是resultType的時候,MyBatis對自動的給把對應的值賦給resultType所指定對象的屬性。

②當提供的返回類型是resultMap時,因為Map不能很好表示領域模型,就需要自己再進一步的把它轉化為對應的對象,這常常在復雜查詢中很有作用。

二、ResultType

Blog.java

public class Blog {

private int id;

private String title;

private String content;

private String owner;

private List comments;

}

其所對應的數據庫表中存儲有id、title、Content、Owner屬性。

select * from t_blog where id = #{id}

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

三、ResultMap

當返回類型直接是一個ResultMap的時候也是非常有用的,這主要用在進行復雜聯合查詢上,因為進行簡單查詢是沒有什么必要的。先看看一個返回類型為ResultMap的簡單查詢,再看看復雜查詢的用法。

①簡單查詢的寫法

select * from t_blog where id = #{id}

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;

}

select * from t_Comment where id = #{id}

select * from t_Blog where id = #{id}

先是請求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中通過一次請求就拿出來的。

select * from t_blog where id = #{id}

select * from t_Comment where blog = #{blogId}

上述請求的入口是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 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 comments = blog.getComments();

if (comments != null) {

for (Comment comment : comments)

System.out.println(comment);

}

session.close();

}

總結

以上是生活随笔為你收集整理的mybatis返回map键值对_mybatis返回map结果集怎么配置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。