欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解mybatis foreach collection示例

 更新時(shí)間:2017年10月15日 11:17:28   作者:JUN_IT  
這篇文章主要介紹了詳解mybatis foreach collection的相關(guān)資料,需要的朋友可以參考下

在SQL開發(fā)過程中,動(dòng)態(tài)構(gòu)建In集合條件查詢是比較常見的用法,在Mybatis中提供了foreach功能,該功能比較強(qiáng)大,它允許你指定一個(gè)集合,聲明集合項(xiàng)和索引變量,它們可以用在元素體內(nèi)。它也允許你指定開放和關(guān)閉的字符串,在迭代之間放置分隔符。這個(gè)元素是很智能的,它不會(huì)偶然地附加多余的分隔符。

下面是一個(gè)演示示例:

 <select id="findByIdsMap" resultMap="BaseResultMap">  
 Select  
 <include refid="Base_Column_List" />  
 from jria where ID in   <foreach item="item" index="index" collection="list"          
 open="(" separator="," close=")">         
 #{item}      
 </foreach> 
</select> 

    但由于官方文檔對(duì)這塊的使用,描述的比較簡短,細(xì)節(jié)上也被忽略掉了(可能是開源項(xiàng)目文檔一貫的問題吧),也使用不少同學(xué)在使用中遇到了問題。特別是foreach這個(gè)函數(shù)中,collection屬性做什么用,有什么注意事項(xiàng)。由于文檔不全,這塊只能通過源代碼剖析的方式來分析一下各個(gè)屬性的相關(guān)要求。

collection屬性的用途是接收輸入的數(shù)組或是List接口實(shí)現(xiàn)。但對(duì)于其名稱的要求,Mybatis在實(shí)現(xiàn)中還是有點(diǎn)不好理解的,所以需要特別注意這一點(diǎn)。

下面開始分析源代碼(筆記使用的是Mybatis 3.0.5版本)

先找到Mybatis執(zhí)行SQL配置解析的入口

MapperMethod.Java類中 public Object execute(Object[] args) 該方法是執(zhí)行的入口.

針對(duì)in集合查詢,對(duì)應(yīng)用就是 selectForList或SelctForMap方法。

但不管調(diào)用哪個(gè)方法,都會(huì)對(duì)原來JDK傳入的參數(shù) Object[]類型,通過 getParam方法轉(zhuǎn)換成一個(gè)Object,那這個(gè)方法是做什么的呢?分析源碼如下:

上圖中標(biāo)紅的兩處,很驚訝的發(fā)現(xiàn),一個(gè)參數(shù)與多個(gè)參數(shù)的處理方式是不同的(后續(xù)很多同學(xué)遇到的問題,就有一大部分出自這個(gè)地方)。如果參數(shù)個(gè)數(shù)大于一個(gè),則會(huì)被封裝成Map, key值如果使用了Mybatis的 Param注解,則會(huì)使用該key值,否則默認(rèn)統(tǒng)一使用數(shù)據(jù)序號(hào),從1開始。這個(gè)問題先記下,繼續(xù)分析代碼,接下來如果是selectForList操作(其它操作就對(duì)應(yīng)用相應(yīng)方法),會(huì)調(diào)用DefaultSqlSession的public List selectList(String statement, Object parameter, RowBounds rowBounds) 方法

又一個(gè)發(fā)現(xiàn),見源代碼如下:

上圖標(biāo)紅部分,對(duì)參數(shù)又做了一次封裝,我們看一下代碼

現(xiàn)在有點(diǎn)清楚了,如果參數(shù)類型是List,則必須在collecion中指定為list, 如果是數(shù)據(jù)組,則必須在collection屬性中指定為 array.

現(xiàn)在就問題就比較清楚了,如果是一個(gè)參數(shù)的話,collection的值取決于你的參數(shù)類型。

如果是多個(gè)值的話,除非使用注解Param指定,否則都是數(shù)字開頭,所以在collection中指定什么值都是無用的。下圖是debug顯示結(jié)果。

針對(duì)上面分析的結(jié)果,下面給出了一個(gè)使用的解決方案,希望對(duì)大家對(duì)幫助。

在使用這個(gè)功能是需要特別注意以下規(guī)則:

1. 當(dāng)查詢的參數(shù)只有一個(gè)時(shí) 

findByIds(List<Long> ids)
1.a 如果參數(shù)的類型是List, 則在使用時(shí),collection屬性要必須指定為 
list <select id="findByIdsMap" resultMap="BaseResultMap">     
Select     
<include refid="Base_Column_List" />    
from jria where ID in
         <foreach item="item" index="index" collection="list" 
             open="(" separator="," close=")">
            #{item}
        </foreach>
 </select>  
 findByIds(Long[] ids) 1.b 如果參數(shù)的類型是Array,則在使用時(shí),collection屬性要必須指定為 array <select id="findByIdsMap" resultMap="BaseResultMap">
         select
         <include refid="Base_Column_List" />
     from jria where ID in
         <foreach item="item" index="index" collection="array" 
             open="(" separator="," close=")">
            #{item}
        </foreach>
 </select> 

  2. 當(dāng)查詢的參數(shù)有多個(gè)時(shí),例如 findByIds(String name, Long[] ids) 這種情況需要特別注意,在傳參數(shù)時(shí),一定要改用Map方式, 這樣在collection屬性可以指定名稱            

下面是一個(gè)示例    

 Map<String, Object> params = new HashMap<String, Object>(2);    params.put("name", name);     params.put("ids", ids);    mapper.findByIdsMap(params); <select id="findByIdsMap" resultMap="BaseResultMap">
         select
         <include refid="Base_Column_List" />
     from jria where ID in
         <foreach item="item" index="index" collection="ids" 
             open="(" separator="," close=")">
            #{item}
        </foreach>
  </select>  

   完整的示例如下:例如有一個(gè)查詢功能,Mapper接口文件定義如下方法: 

 List<Jria> findByIds(Long... ids);

   使用 in 查詢的sql拼裝方法如下:  

 <select id="findbyIds" resultMap="BaseResultMap">
         select
         <include refid="Base_Column_List" />
     from jria where ID in
         <foreach item="item" index="index" collection="array" 
             open="(" separator="," close=")">
            #{item}
        </foreach>
 </select> 

總結(jié)

以上所述是小編給大家介紹的mybatis foreach collection,希望對(duì)大家有所幫助!

相關(guān)文章

  • mybatis查詢匹配機(jī)制圖文詳解

    mybatis查詢匹配機(jī)制圖文詳解

    這篇文章主要給大家介紹了關(guān)于mybatis查詢匹配機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Spring加載properties文件的方法

    Spring加載properties文件的方法

    這篇文章主要為大家詳細(xì)介紹了Spring加載properties文件的兩種方法,一是通過xml方式,另一種方式是通過注解方式,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 緩存工具類ACache使用方法詳解

    緩存工具類ACache使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了緩存工具類ACache的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java中關(guān)于內(nèi)存泄漏出現(xiàn)的原因匯總及如何避免內(nèi)存泄漏(超詳細(xì)版)

    Java中關(guān)于內(nèi)存泄漏出現(xiàn)的原因匯總及如何避免內(nèi)存泄漏(超詳細(xì)版)

    這篇文章主要介紹了Java中關(guān)于內(nèi)存泄漏出現(xiàn)的原因匯總及如何避免內(nèi)存泄漏(超詳細(xì)版)的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • springboot 如何修改默認(rèn)端口及application.properties常用配置

    springboot 如何修改默認(rèn)端口及application.properties常用配置

    這篇文章主要介紹了springboot 如何修改默認(rèn)端口及application.properties常用配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 簡單了解spring bean作用域?qū)傩詓ingleton和prototype的區(qū)別

    簡單了解spring bean作用域?qū)傩詓ingleton和prototype的區(qū)別

    這篇文章主要介紹了簡單了解spring bean作用域?qū)傩詓ingleton和prototype的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Lombok?安裝和使用小技巧

    Lombok?安裝和使用小技巧

    這篇文章主要介紹了Lombok?安裝和使用指南,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • SpringBoot+VUE實(shí)現(xiàn)前后端分離的實(shí)戰(zhàn)記錄

    SpringBoot+VUE實(shí)現(xiàn)前后端分離的實(shí)戰(zhàn)記錄

    這篇文章主要介紹了SpringBoot+VUE實(shí)現(xiàn)前后端分離的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 在同一個(gè)類中調(diào)用帶有@Transactional注解的方法示例

    在同一個(gè)類中調(diào)用帶有@Transactional注解的方法示例

    這篇文章主要為大家介紹了在同一個(gè)類中調(diào)用帶有@Transactional注解的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Spring中實(shí)現(xiàn)的三種異步流式接口方法

    Spring中實(shí)現(xiàn)的三種異步流式接口方法

    在現(xiàn)代Web開發(fā)中,接口超時(shí)是一個(gè)常見的問題,尤其是在處理耗時(shí)操作時(shí),傳統(tǒng)的同步接口在處理長時(shí)間任務(wù)時(shí)會(huì)阻塞請(qǐng)求線程,從而影響系統(tǒng)的響應(yīng)能力,本文將詳細(xì)講解Spring中實(shí)現(xiàn)的三種異步流式接口方法,需要的朋友可以參考下
    2024-10-10

最新評(píng)論