Mybatis List列表In查詢實現的注意事項

2021-10-04 19:22:28 字數 1286 閱讀 2434

collection屬性的用途是接收輸入的陣列或是list介面實現。但對於其名稱的要求,mybatis在實現中還是有點不好理解的,所以需要特別注意這一點。

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

先找到mybatis執行sql配置解析的入口

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

但不管呼叫哪個方法,都會對原來jdk傳入的引數 object型別,通過 getparam方法轉換成乙個object,那這個方法是做什麼的呢?分析原始碼如下:

上圖中標紅的兩處,很驚訝的發現,乙個引數與多個引數的處理方式是不同的(後續很多同學遇到的問題,就有一大部分出自這個地方)。如果引數個數大於乙個,則會被封裝成map, key值如果使用了mybatis的 param註解,則會使用該key值,否則預設統一使用資料序號,從1開始。這個問題先記下,繼續分析**,接下來如果是selectforlist操作(其它操作就對應用相應方法),會呼叫defaultsqlsession的public list selectlist(string statement, object parameter, rowbounds rowbounds) 方法

又乙個發現,見源**如下:

上圖示紅部分,對引數又做了一次封裝,我們看一下**

現在有點清楚了,如果引數型別是list,則必須在collecion中指定為list, 如果是資料組,則必須在collection屬性中指定為 array.

現在就問題就比較清楚了,如果是乙個引數的話,collection的值取決於你的引數型別。

如果是多個值的話,除非使用註解param指定,否則都是數字開頭,所以在collection中指定什麼值都是無用的。下圖是debug顯示結果。

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

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

當查詢的引數只有乙個時

findbyids(list ids)

1.a 如果引數的型別是list, 則在使用時,collection屬性要必須指定為 list

select

from jria where id in#

findbyids(long ids)

1.b 如果引數的型別是array,則在使用時,collection屬性要必須指定為 array

select

from jria where id in

# select from jria where id in #

where id in

#1=2

Mybatis List批量插入資料

mysql中批量新增資料一般我們使用 insert into table 欄位1,欄位2 values 欄位1的值,欄位2的值 欄位1的值,欄位2的值 在mybatis中如何實現批量插入資料 insertfullcutlvlist insert into promotion fullcut lv f...

列表基礎 列表訪問,列表遍歷

定義乙個列表 infos hello world python 正向索引01 2列表資料 hello world python 反向索引 3 2 1正向訪問列表 定義乙個列表 infos hello world python print infos 0 print infos 1 print inf...

列表list 列表巢狀 列表推導式

1 列表list l1 a b c d 列表下標 補償與字串相同。2 列表方法 函式 in not in len 方法 列表1 列表2 拼接 列表1 數字 重複列表內容 reverse 方法 反序 sort 方法 排序 max 函式 選取最大值 min 函式 選取最小值 3 增刪改查方法 增a.in...