MyBatis 配置之集合的嵌套方式
MyBatis 配置之集合的嵌套
前言介紹
在一些查詢結(jié)果包裝類中,包含一些 List 集合屬性,使用 collection 標(biāo)簽可以聲明該 List 集合中屬性的類型,便于 MyBatis 對包裝類中的集合類型屬性進(jìn)行映射。
代碼示例
例如商城,取出某一個商品信息以及該商品的評價(jià)列表,其中商品包裝類 Product 的定義代碼如下:
package cn.com.mybatis.pojo; public class Product{ //商品id private int pid; //商品名稱 private String pname; //商品的評價(jià)信息 private List<Reply> replys; //get和set方法 }
此時,商品的評價(jià)信息就是一個 List,所以在定義結(jié)果映射配置時,使用 collection 來定義評價(jià)結(jié)果集合,示例代碼如下:
<resultMap id="productResult" type="cn.com.mybatis.pojo.Product"> <id property="pid" column="product_id"/> <result property="pname" column="product_name"/> <collection property="replys" select="queryReplyByProductId" column="product_id" ofType="Reply"/> </resultMap> <select id="queryProductInfo" parameterType="int" resultMap="productResult"> select P.id as product_id, P.name as product_name from product P WHERE P.id = #{id} </select> <select id="queryReplyByProductId" parameterType="int" resultType="Reply"> select * from reply R WHERE R.pid = #{ProductId} </select>
以上示例中,Product 與商品評價(jià) Reply 會進(jìn)行關(guān)聯(lián),一個商品評價(jià) Reply 的 pid 只對應(yīng)一個商品 Product 的 id,而一個商品 Product 的 id 可對應(yīng)多個商品評價(jià) Reply 的 pid,是一對多的關(guān)系。
通過配置集合的嵌套結(jié)果,就可以將查詢結(jié)果中的包裝類的集合類型的屬性嵌套到結(jié)果集中。通過上面的配置最終得到一個包含 Reply 的 List 的商品包裝類 Product。
外部引用
collection 標(biāo)簽也可以引入外部的 resultMap 配置。如果 queryReplyByProductId 配置的 sql 查詢結(jié)果中使用了別名,或數(shù)據(jù)庫字段名與 Reply 類屬性名不對應(yīng),此時需要返回一個名為 replyResult 的 resultMap,那么 productResult 中的 collection 可以做如下配置:
<resultMap id="productResult" type="cn.com.mybatis.pojo.Product"> <id property="pid" column="product_id"/> <result property="pname" column="product_name"/> <collection property="replys" ofType="Reply" resultMap="replyResult" columnPrefix="reply_"> </resultMap> <resultMap id="replyResult" type="Reply"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="info" column="info"/> </resultMap>
columnPrefix 代表為外部引入的 resultMap 中的每一個元素的 column 屬性加上一個前綴。
小結(jié)一下吧
在一些查詢結(jié)果包裝類中,包含一些 List 集合屬性,可使用 collection 標(biāo)簽聲明該 List 集合中屬性的類型。以便于 MyBatis 對包裝類中的集合類型屬性進(jìn)行映射??梢栽?collection 標(biāo)簽中配置,也可以引入外部的 resultMap 做配置。
MyBatis 集合、集合嵌套查詢
集合
<collection property="posts" ofType="domain.blog.Post"> <id property="id" column="post_id"/> <result property="subject" column="post_subject"/> <result property="body" column="post_body"/> </collection>
集合元素的作用幾乎和關(guān)聯(lián)是相同的。實(shí)際上,它們也很相似,文檔的異同是多余的。 所以我們更多關(guān)注于它們的不同。
我們來繼續(xù)上面的示例,一個博客只有一個作者。但是博客有很多文章。在博客類中, 這可以由下面這樣的寫法來表示:
private List<Post> posts;
要映射嵌套結(jié)果集合到 List 中,我們使用集合元素。就像關(guān)聯(lián)元素一樣,我們可以從 連接中使用嵌套查詢,或者嵌套結(jié)果。
集合的嵌套查詢
首先,讓我們看看使用嵌套查詢來為博客加載文章。
<resultMap id="blogResult" type="Blog"> <collection property="posts" javaType="ArrayList" column="id" ofType="Post" select="selectPostsForBlog"/> </resultMap> <select id="selectBlog" resultMap="blogResult"> SELECT * FROM BLOG WHERE ID = #{id} </select> <select id="selectPostsForBlog" resultType="Post"> SELECT * FROM POST WHERE BLOG_ID = #{id} </select>
這里你應(yīng)該注意很多東西,但大部分代碼和上面的關(guān)聯(lián)元素是非常相似的。首先,你應(yīng) 該注意我們使用的是集合元素。然后要注意那個新的“ofType”屬性。這個屬性用來區(qū)分 JavaBean(或字段)屬性類型和集合包含的類型來說是很重要的。所以你可以讀出下面這個 映射:
<collection property="posts" javaType="ArrayList" column="id" ofType="Post" select="selectPostsForBlog"/>
讀作: “在 Post 類型的 ArrayList 中的 posts 的集合?!?/p>
javaType 屬性是不需要的,因?yàn)?MyBatis 在很多情況下會為你算出來。所以你可以縮短 寫法:
<collection property="posts" column="id" ofType="Post" select="selectPostsForBlog"/>
集合的嵌套結(jié)果
至此,你可以猜測集合的嵌套結(jié)果是如何來工作的,因?yàn)樗完P(guān)聯(lián)完全相同,除了它應(yīng) 用了一個“ofType”屬性
首先, 讓我們看看 SQL:
<select id="selectBlog" resultMap="blogResult"> select B.id as blog_id, B.title as blog_title, B.author_id as blog_author_id, P.id as post_id, P.subject as post_subject, P.body as post_body, from Blog B left outer join Post P on B.id = P.blog_id where B.id = #{id} </select>
我們又一次聯(lián)合了博客表和文章表,而且關(guān)注于保證特性,結(jié)果列標(biāo)簽的簡單映射?,F(xiàn) 在用文章映射集合映射博客,可以簡單寫為:
<resultMap id="blogResult" type="Blog"> <id property="id" column="blog_id" /> <result property="title" column="blog_title"/> <collection property="posts" ofType="Post"> <id property="id" column="post_id"/> <result property="subject" column="post_subject"/> <result property="body" column="post_body"/> </collection> </resultMap>
同樣,要記得 id 元素的重要性,如果你不記得了,請閱讀上面的關(guān)聯(lián)部分。
同樣, 如果你引用更長的形式允許你的結(jié)果映射的更多重用,你可以使用下面這個替代 的映射:
<resultMap id="blogResult" type="Blog"> <id property="id" column="blog_id" /> <result property="title" column="blog_title"/> <collection property="posts" ofType="Post" resultMap="blogPostResult" columnPrefix="post_"/> </resultMap> <resultMap id="blogPostResult" type="Post"> <id property="id" column="id"/> <result property="subject" column="subject"/> <result property="body" column="body"/> </resultMap>
注意 這個對你所映射的內(nèi)容沒有深度,廣度或關(guān)聯(lián)和集合相聯(lián)合的限制。當(dāng)映射它們 時你應(yīng)該在大腦中保留它們的表現(xiàn)。
你的應(yīng)用在找到最佳方法前要一直進(jìn)行的單元測試和性 能測試。好在 myBatis 讓你后來可以改變想法,而不對你的代碼造成很小(或任何)影響。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Security OAuth2 token權(quán)限隔離實(shí)例解析
這篇文章主要介紹了Spring Security OAuth2 token權(quán)限隔離實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11springboot無法跳轉(zhuǎn)頁面的問題解決方案
這篇文章主要介紹了springboot無法跳轉(zhuǎn)頁面的問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09spring boot開發(fā)遇到坑之spring-boot-starter-web配置文件使用教程
Spring Boot支持容器的自動配置,默認(rèn)是Tomcat,當(dāng)然我們也是可以進(jìn)行修改的。這篇文章給大家介紹了spring boot開發(fā)遇到坑之spring-boot-starter-web配置文件使用教程,需要的朋友參考下吧2018-01-01mybatisplus自動填充屬性值的實(shí)現(xiàn)步驟
MyBatis-Plus提供自動填充的功能,幫助自定設(shè)置這些字段的值,提升開發(fā)效率,本文就來介紹一下如何使用,感興趣的可以了解一下2023-12-12