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

Mybatis?List列表In查詢實現(xiàn)的注意事項說明

 更新時間:2022年02月08日 09:42:49   作者:x.matthew  
這篇文章主要介紹了Mybatis?List列表In查詢實現(xiàn)的注意事項說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

在SQL開發(fā)過程中,動態(tài)構(gòu)建In集合條件查詢是比較常見的用法,在Mybatis中提供了foreach功能,該功能比較強大,它允許你指定一個集合,聲明集合項和索引變量,它們可以用在元素體內(nèi)。

它也允許你指定開放和關(guān)閉的字符串,在迭代之間放置分隔符。

這個元素是很智能的,它不會偶然地附加多余的分隔符。

下面是一個演示示例

?<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屬性做什么用,有什么注意事項。由于文檔不全,這塊只能通過源代碼剖析的方式來分析一下各個屬性的相關(guān)要求。

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 方法。

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

分析源碼如下

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

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

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

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

findByIds(List<Long> ids)

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)

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

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

相關(guān)文章

  • 詳解java中的深拷貝和淺拷貝(clone()方法的重寫、使用序列化實現(xiàn)真正的深拷貝)

    詳解java中的深拷貝和淺拷貝(clone()方法的重寫、使用序列化實現(xiàn)真正的深拷貝)

    這篇文章主要介紹了java中的深拷貝和淺拷貝(clone()方法的重寫、使用序列化實現(xiàn)真正的深拷貝),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 詳解SpringBoot中的統(tǒng)一結(jié)果返回與統(tǒng)一異常處理

    詳解SpringBoot中的統(tǒng)一結(jié)果返回與統(tǒng)一異常處理

    這篇文章主要將通過詳細的討論和實例演示來幫助你更好地理解和應用Spring Boot中的統(tǒng)一結(jié)果返回和統(tǒng)一異常處理,感興趣的小伙伴可以了解下
    2024-03-03
  • 使用Java實現(xiàn)解析Excel公式

    使用Java實現(xiàn)解析Excel公式

    在日常工作中,我們經(jīng)常需要在Excel中使用公式對表中數(shù)據(jù)進行計算和分析,所以本文小編主要來和大家介紹一下如何在Java中實現(xiàn)解析Excel公式,感興趣的可以了解下
    2024-02-02
  • 公共POI導出Excel方法詳解

    公共POI導出Excel方法詳解

    這篇文章主要介紹了公共POI導出Excel方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • Java通過經(jīng)緯度坐標獲取兩個點之間的直線距離的示例

    Java通過經(jīng)緯度坐標獲取兩個點之間的直線距離的示例

    這篇文章主要介紹了Java通過經(jīng)緯度坐標獲取兩個點之間的直線距離的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • springboot+springsecurity+mybatis+JWT+Redis?實現(xiàn)前后端離實戰(zhàn)教程

    springboot+springsecurity+mybatis+JWT+Redis?實現(xiàn)前后端離實戰(zhàn)教程

    這篇文章主要介紹了springboot+springsecurity+mybatis+JWT+Redis?實現(xiàn)前后端離實戰(zhàn)教程,需要的朋友可以參考下
    2024-01-01
  • 詳解spring注解式參數(shù)校驗

    詳解spring注解式參數(shù)校驗

    本篇文章主要介紹了詳解spring注解式參數(shù)校驗,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java零基礎(chǔ)講解異常

    Java零基礎(chǔ)講解異常

    異常就是不正常,比如當我們身體出現(xiàn)了異常我們會根據(jù)身體情況選擇喝開水、吃藥、看病、等?異常處理方法。?java異常處理機制是我們java語言使用異常處理機制為程序提供了錯誤處理的能力,程序出現(xiàn)的錯誤,程序可以安全的退出,以保證程序正常的運行等
    2022-04-04
  • SpringBoot工程啟動順序與自定義監(jiān)聽超詳細講解

    SpringBoot工程啟動順序與自定義監(jiān)聽超詳細講解

    這篇文章主要介紹了SpringBoot工程啟動順序與自定義監(jiān)聽,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-11-11
  • 基于Integer值判斷是否相等的問題

    基于Integer值判斷是否相等的問題

    這篇文章主要介紹了基于Integer值判斷是否相等的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評論