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

MyBatis 配置之集合的嵌套方式

 更新時間:2021年09月23日 16:03:54   作者:aFa攻防實驗室  
這篇文章主要介紹了MyBatis 配置之集合的嵌套方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

MyBatis 配置之集合的嵌套

前言介紹

在一些查詢結果包裝類中,包含一些 List 集合屬性,使用 collection 標簽可以聲明該 List 集合中屬性的類型,便于 MyBatis 對包裝類中的集合類型屬性進行映射。

代碼示例

例如商城,取出某一個商品信息以及該商品的評價列表,其中商品包裝類 Product 的定義代碼如下:

package cn.com.mybatis.pojo;
public class Product{
    //商品id
    private int pid;
    //商品名稱
    private String pname;
    //商品的評價信息
    private List<Reply> replys;
    //get和set方法
}

此時,商品的評價信息就是一個 List,所以在定義結果映射配置時,使用 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" 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 與商品評價 Reply 會進行關聯(lián),一個商品評價 Reply 的 pid 只對應一個商品 Product 的 id,而一個商品 Product 的 id 可對應多個商品評價 Reply 的 pid,是一對多的關系。

通過配置集合的嵌套結果,就可以將查詢結果中的包裝類的集合類型的屬性嵌套到結果集中。通過上面的配置最終得到一個包含 Reply 的 List 的商品包裝類 Product。

外部引用

collection 標簽也可以引入外部的 resultMap 配置。如果 queryReplyByProductId 配置的 sql 查詢結果中使用了別名,或數(shù)據(jù)庫字段名與 Reply 類屬性名不對應,此時需要返回一個名為 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 屬性加上一個前綴。

小結一下吧

在一些查詢結果包裝類中,包含一些 List 集合屬性,可使用 collection 標簽聲明該 List 集合中屬性的類型。以便于 MyBatis 對包裝類中的集合類型屬性進行映射??梢栽?collection 標簽中配置,也可以引入外部的 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>

集合元素的作用幾乎和關聯(lián)是相同的。實際上,它們也很相似,文檔的異同是多余的。 所以我們更多關注于它們的不同。

我們來繼續(xù)上面的示例,一個博客只有一個作者。但是博客有很多文章。在博客類中, 這可以由下面這樣的寫法來表示:

private List<Post> posts;

要映射嵌套結果集合到 List 中,我們使用集合元素。就像關聯(lián)元素一樣,我們可以從 連接中使用嵌套查詢,或者嵌套結果。

集合的嵌套查詢

首先,讓我們看看使用嵌套查詢來為博客加載文章。

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

這里你應該注意很多東西,但大部分代碼和上面的關聯(lián)元素是非常相似的。首先,你應 該注意我們使用的是集合元素。然后要注意那個新的“ofType”屬性。這個屬性用來區(qū)分 JavaBean(或字段)屬性類型和集合包含的類型來說是很重要的。所以你可以讀出下面這個 映射:

<collection property="posts" javaType="ArrayList" column="id" ofType="Post" select="selectPostsForBlog"/>

讀作: “在 Post 類型的 ArrayList 中的 posts 的集合。”

javaType 屬性是不需要的,因為 MyBatis 在很多情況下會為你算出來。所以你可以縮短 寫法:

<collection property="posts" column="id" ofType="Post" select="selectPostsForBlog"/>

集合的嵌套結果

至此,你可以猜測集合的嵌套結果是如何來工作的,因為它和關聯(lián)完全相同,除了它應 用了一個“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)合了博客表和文章表,而且關注于保證特性,結果列標簽的簡單映射?,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 元素的重要性,如果你不記得了,請閱讀上面的關聯(lián)部分。

同樣, 如果你引用更長的形式允許你的結果映射的更多重用,你可以使用下面這個替代 的映射:

<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)容沒有深度,廣度或關聯(lián)和集合相聯(lián)合的限制。當映射它們 時你應該在大腦中保留它們的表現(xiàn)。

你的應用在找到最佳方法前要一直進行的單元測試和性 能測試。好在 myBatis 讓你后來可以改變想法,而不對你的代碼造成很小(或任何)影響。

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

相關文章

  • Springmvc自定義參數(shù)轉換實現(xiàn)代碼解析

    Springmvc自定義參數(shù)轉換實現(xiàn)代碼解析

    這篇文章主要介紹了Springmvc自定義參數(shù)轉換實現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • mybatis嵌套循環(huán)map方式(高級用法)

    mybatis嵌套循環(huán)map方式(高級用法)

    這篇文章主要介紹了mybatis嵌套循環(huán)map方式(高級用法),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 淺談java異常處理之空指針異常

    淺談java異常處理之空指針異常

    下面小編就為大家?guī)硪黄獪\談java異常處理之空指針異常。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • Springboot日志開啟SLF4J過程解析

    Springboot日志開啟SLF4J過程解析

    這篇文章主要介紹了Springboot日志開啟SLF4J過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Java高并發(fā)下請求合并處理方式

    Java高并發(fā)下請求合并處理方式

    這篇文章主要介紹了Java高并發(fā)下請求合并處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • java遍歷Map的幾種方法分析

    java遍歷Map的幾種方法分析

    這篇文章主要介紹了java遍歷Map的幾種方法,結合實例形式分析了使用循環(huán)與迭代等方法操作Map遍歷的相關技巧,需要的朋友可以參考下
    2016-08-08
  • java調(diào)用python腳本引入第三方庫失敗的實現(xiàn)

    java調(diào)用python腳本引入第三方庫失敗的實現(xiàn)

    本文主要介紹了java調(diào)用python腳本引入第三方庫失敗的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • java基礎之標簽、按鈕和按鈕事件簡介

    java基礎之標簽、按鈕和按鈕事件簡介

    本文給大家?guī)淼氖莏ava圖形界面的基礎知識,簡單介紹了標簽、按鈕和按鈕事件,十分的詳細,有需要的小伙伴可以參考下。
    2015-06-06
  • Java服務假死后續(xù)之內(nèi)存溢出的原因分析

    Java服務假死后續(xù)之內(nèi)存溢出的原因分析

    這篇文章主要介紹了Java服務假死后續(xù)之內(nèi)存溢出,本文給大家分享原因排查和故障解決方法,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • java代理模式(jdk proxy)

    java代理模式(jdk proxy)

    代理(Proxy)是一種設計模式,提供了對目標對象另外的訪問方式;這篇文章主要介紹了Java 中的三種代理模式,需要的朋友可以參考下,希望能幫助到你
    2021-07-07

最新評論

泰兴市| 进贤县| 西丰县| 湖南省| 福泉市| 冷水江市| 通许县| 突泉县| 依安县| 会宁县| 安顺市| 罗平县| 衡阳县| 双江| 丰都县| 弋阳县| 罗甸县| 盐亭县| 浑源县| 图木舒克市| 图们市| 沿河| 英德市| 军事| 三河市| 盐边县| 通州市| 喀喇沁旗| 宜黄县| 桓仁| 阳泉市| 丰顺县| 梓潼县| 宁化县| 壶关县| 环江| 都江堰市| 宁都县| 钟山县| 蓬莱市| 廉江市|