国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 詳解mybatis foreach collection示例

詳解mybatis foreach collection示例

2021-01-18 10:05JUN_IT Java教程

這篇文章主要介紹了詳解mybatis foreach collection的相關(guān)資料,需要的朋友可以參考下

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

下面是一個演示示例:

?
1
2
3
4
5
6
7
8
<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>

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

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

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

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

mappermethod.java類中 public object execute(object[] args) 該方法是執(zhí)行的入口.

針對in集合查詢,對應(yīng)用就是 selectforlist或selctformap方法。

詳解mybatis foreach collection示例

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

詳解mybatis foreach collection示例

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

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

詳解mybatis foreach collection示例

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

詳解mybatis foreach collection示例

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

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

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

詳解mybatis foreach collection示例

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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. 當(dāng)查詢的參數(shù)有多個時,例如 findbyids(string name, long[] ids) 這種情況需要特別注意,在傳參數(shù)時,一定要改用map方式, 這樣在collection屬性可以指定名稱            

下面是一個示例    

?
1
2
3
4
5
6
7
8
9
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接口文件定義如下方法: 

?
1
list<jria> findbyids(long... ids);

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

?
1
2
3
4
5
6
7
8
9
<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,希望對大家有所幫助!

原文鏈接:http://blog.csdn.net/j_u_n1991/article/details/78234311

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 中文字幕日韩在线视频 | 成人a视频在线观看 | 日韩欧美在线一区二区 | 欧美精品一区二区三区在线播放 | 午夜亚洲一区 | 国产成人精品一区二 | 精品国精品国产自在久不卡 | 91久久综合亚洲鲁鲁五月天 | 嫩呦国产一区二区三区av | 黄色大片免费网址 | 国产精品中文字幕在线观看 | 免费观看av| 在线日韩成人 | 亚洲视频1区 | 亚洲欧美视屏 | 欧美色综合天天久久综合精品 | 亚洲精品国产二区 | 国产精品久久久久久久久久免费 | 欧美a在线| 久久久久久九九 | 黄色片网站在线免费观看 | 美女视频黄的免费 | 麻豆国产免费 | 久久久久久久国产精品 | 韩国毛片在线观看 | 日韩欧美国产一区二区三区 | 一区自拍| 日韩在线观看第一页 | 视频在线一区 | 性刺激久久久久久久久九色 | 黄色免费在线视频 | 免费一区二区 | 国产在线精品一区二区 | 日日摸夜夜添夜夜添特色大片 | 自拍亚洲 | 欧美在线免费观看 | 国产精品美女久久久久高潮 | 99精品视频在线免费观看 | av在线免费网址 | 免费一区二区三区四区 | 日本成人一区 |