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

詳解mybatis foreach collection示例

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

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

下面是一個演示示例:

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

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

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

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

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

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

針對in集合查詢,對應用就是 selectForList或SelctForMap方法。

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

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

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

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

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

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

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

針對上面分析的結果,下面給出了一個使用的解決方案,希望對大家對幫助。

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

1. 當查詢的參數(shù)只有一個時 

findByIds(List<Long> ids)
1.a 如果參數(shù)的類型是List, 則在使用時,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,則在使用時,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. 當查詢的參數(shù)有多個時,例如 findByIds(String name, Long[] ids) 這種情況需要特別注意,在傳參數(shù)時,一定要改用Map方式, 這樣在collection屬性可以指定名稱            

下面是一個示例    

 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>  

   完整的示例如下:例如有一個查詢功能,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> 

總結

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

相關文章

  • Jsoup解析HTML實例及文檔方法詳解

    Jsoup解析HTML實例及文檔方法詳解

    這篇文章主要介紹了Jsoup如何解析一個HTML文檔、從文件加載文檔、從URL加載Document等方法,對Jsoup常用方法做了詳細講解,最近提供了一個示例供大家參考 使用DOM方法來遍歷一個文檔 從元素抽取屬性,文本和HTML 獲取所有鏈接
    2013-11-11
  • Spring Cloud使用Feign進行遠程調用的操作指南

    Spring Cloud使用Feign進行遠程調用的操作指南

    本文介紹了Feign作為聲明式HTTP客戶端在SpringCloud中的使用,從簡介、對比RestTemplate的問題、使用步驟,到日志配置、性能優(yōu)化和實際應用進行了詳細講解,包括如何通過Feign簡化接口調用,以及解決啟動時找不到FeignClient的問題,需要的朋友可以參考下
    2025-02-02
  • SpringBoot配置開發(fā)環(huán)境的詳細步驟(JDK、Maven、IDEA等)

    SpringBoot配置開發(fā)環(huán)境的詳細步驟(JDK、Maven、IDEA等)

    文章介紹了如何配置SpringBoot開發(fā)環(huán)境,包括安裝JDK、Maven和IDEA,并提供了詳細的步驟和配置方法,感興趣的朋友一起看看吧
    2024-12-12
  • SpringBoot+WebSocket實現(xiàn)即時通訊功能(Spring方式)

    SpringBoot+WebSocket實現(xiàn)即時通訊功能(Spring方式)

    今天給大家分享一個SpringBoot+WebSocket實現(xiàn)即時通訊功能(Spring方式),WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議,文章通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • java實現(xiàn)斐波那契數(shù)列的3種方法

    java實現(xiàn)斐波那契數(shù)列的3種方法

    這篇文章主要介紹了java實現(xiàn)斐波那契數(shù)列的3種方法,有需要的朋友可以參考一下
    2014-01-01
  • 基于Java實現(xiàn)回調監(jiān)聽工具類

    基于Java實現(xiàn)回調監(jiān)聽工具類

    這篇文章主要為大家詳細介紹了如何基于Java實現(xiàn)一個回調監(jiān)聽工具類,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-04-04
  • Java?Guava異步編程實踐

    Java?Guava異步編程實踐

    今天咱們要聊的是Guava在異步編程中的應用,讓我們搞清楚為什么要用Guava來處理異步任務,在Java的世界里,異步編程是個老話題了,但它依舊非常關鍵,它能讓咱們的應用更高效,尤其是在處理那些耗時的I/O操作
    2023-12-12
  • java簡單實現(xiàn)桌球滾動效果

    java簡單實現(xiàn)桌球滾動效果

    這篇文章主要為大家詳細介紹了java簡單實現(xiàn)桌球滾動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Java中Parser的用法

    Java中Parser的用法

    這篇文章主要介紹了Java?Parser使用指南,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • java虛擬機學習筆記基礎篇

    java虛擬機學習筆記基礎篇

    在本篇文章里小編給大家整理的是關于java虛擬機學習筆記的相關內容,分享了一些基礎知識點,需要的朋友們參考下。
    2019-06-06

最新評論

甘洛县| 交口县| 麟游县| 康保县| 盐山县| 屏东市| 五家渠市| 罗田县| 临海市| 无极县| 叙永县| 阿拉善左旗| 宁夏| 乌恰县| 涪陵区| 无为县| 读书| 云南省| 呼伦贝尔市| 泾阳县| 晋中市| 郧西县| 清原| 岳池县| 无极县| 沂南县| 平利县| 梓潼县| 黔西| 安陆市| 马尔康县| 嫩江县| 莒南县| 罗山县| 方城县| 贵德县| 中超| 曲麻莱县| 襄垣县| 邯郸县| 迁西县|