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

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

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

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

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

但不管調(diào)用哪個(gè)方法,都會(huì)對原來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ù)序號,從1開始。這個(gè)問題先記下,繼續(xù)分析代碼,接下來如果是selectForList操作(其它操作就對應(yīng)用相應(yīng)方法),會(huì)調(diào)用DefaultSqlSession的public List selectList(String statement, Object parameter, RowBounds rowBounds) 方法

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

上圖標(biāo)紅部分,對參數(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é)果。

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

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

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

findByIds(List<Long> ids)

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)

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

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

相關(guān)文章

  • 利用spring-data-redis實(shí)現(xiàn)incr自增的操作

    利用spring-data-redis實(shí)現(xiàn)incr自增的操作

    這篇文章主要介紹了利用spring-data-redis實(shí)現(xiàn)incr自增的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 一段代碼搞懂關(guān)于Java中List、Set集合及Map的使用

    一段代碼搞懂關(guān)于Java中List、Set集合及Map的使用

    這篇文章主要介紹了關(guān)于Java中List、Set集合及Map的使用及l(fā)ist,set和map三者的區(qū)別介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • hdfs集成springboot使用方法

    hdfs集成springboot使用方法

    這篇文章主要介紹了hdfs集成springboot使用,配置Configuration信息分為兩種方式,每種方式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • mybatis寫xml時(shí)數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解

    mybatis寫xml時(shí)數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解

    這篇文章主要介紹了mybatis寫xml時(shí)數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Mybatis foreach用法解析--對于list和array

    Mybatis foreach用法解析--對于list和array

    這篇文章主要介紹了Mybatis foreach用法解析--對于list和array,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 基于JAVA中的四種JSON解析方式詳解

    基于JAVA中的四種JSON解析方式詳解

    這篇文章主要介紹了基于JAVA中的四種JSON解析方式詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 使用JMeter進(jìn)行接口高并發(fā)測試的實(shí)現(xiàn)

    使用JMeter進(jìn)行接口高并發(fā)測試的實(shí)現(xiàn)

    本文主要介紹了使用JMeter進(jìn)行接口高并發(fā)測試的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • MapStruct表達(dá)式應(yīng)用及避坑詳解

    MapStruct表達(dá)式應(yīng)用及避坑詳解

    一不小心踩了MapStruct表達(dá)式的坑,發(fā)現(xiàn)了一個(gè)在官方文檔上都找不到的功能,有必要記錄下。MapStruct是一個(gè)代碼生成器,它基于約定優(yōu)于配置的方法大大簡化了Java?Bean類型之間的映射的實(shí)現(xiàn)
    2022-02-02
  • Java類加載策略之雙親委派機(jī)制全面分析講解

    Java類加載策略之雙親委派機(jī)制全面分析講解

    這篇文章主要介紹了Java雙親委派機(jī)制,雙親委派模型是Java加載類的機(jī)制,采用雙親委派模型的好處是Java類隨著它的類加載器一起具備了一種帶有優(yōu)先級的層級關(guān)系,通過這種層級關(guān)系可以避免類的重復(fù)加載,感興趣的朋友可以參考下
    2023-12-12
  • Java中的StackOverflowError錯(cuò)誤問題及解決方法

    Java中的StackOverflowError錯(cuò)誤問題及解決方法

    這篇文章主要介紹了Java中的StackOverflowError錯(cuò)誤,在本文中,我們仔細(xì)研究了StackOverflower錯(cuò)誤,包括Java代碼如何導(dǎo)致它,以及我們?nèi)绾卧\斷和修復(fù)它,需要的朋友可以參考下
    2022-07-07

最新評論

府谷县| 略阳县| 城固县| 岐山县| 娱乐| 宝兴县| 东莞市| 黄浦区| 清流县| 南涧| 平顶山市| 固安县| 岳西县| 夏河县| 沁阳市| 个旧市| 青神县| 台北县| 宜阳县| 稻城县| 乐至县| 托里县| 故城县| 临西县| 肃宁县| 江源县| 甘南县| 镶黄旗| 台北市| 宜宾县| 独山县| 宝丰县| 晋中市| 沙河市| 巩留县| 平武县| 电白县| 米易县| 将乐县| 海林市| 嵩明县|