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

mybatis?foreach?list特殊處理方式

 更新時(shí)間:2022年03月23日 08:45:09   作者:51xplan  
這篇文章主要介紹了mybatis?foreach?list特殊處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

foreach list特殊處理

最近做一個(gè)功能,sql要用到 IN 條件,通過list傳入IN 的值,如:

SELECT * FROM table1 WHERE id in (1,2,3)

對(duì)應(yīng)的mybatis寫法為:

? ? <select id="queryByIds" resultMap="resultMap" parameterType="list">
? ? ? ? SELECT * FROM table1
? ? ? ? WHERE id
? ? ? ? <foreach collection="list" item="rid" open="in(" separator="," close=")">
? ? ? ? ? ? #{rid}
? ? ? ? </foreach>
? ? </select>

期望結(jié)果是按list的值進(jìn)行查詢。

可是,當(dāng)list為空的時(shí)候呢?

sql應(yīng)該是這樣的SELECT * FROM table1 WHERE id in ()。直接在mysql中運(yùn)行肯定是語(yǔ)法錯(cuò)誤的。

無論如何是不會(huì)查到數(shù)據(jù)的,但mybatis又是什么策略呢?直接把這一條where條件給我忽略了…導(dǎo)致查全表數(shù)據(jù)。

這也不好說mybatis做的好不好,算不算bug了。

既然知道套路了,就得有策略來應(yīng)對(duì)了。于是多寫了兩個(gè)if。

? ? <select id="queryByIds" resultMap="resultMap" parameterType="list">
? ? ? ? SELECT * FROM table1
? ? ? ? WHERE id
? ? ? ? <if test="list != null and list.size() > 0">
? ? ? ? ? ? <foreach collection="list" item="rid" open="in(" separator="," close=")">
? ? ? ? ? ? ? ? #{rid}
? ? ? ? ? ? </foreach>
? ? ? ? </if>
? ? ? ? <if test="list == null or list.size() == 0">
? ? ? ? ? ? = -1
? ? ? ? </if>
? ? </select>

不算是這么上策,但也能解決問題,當(dāng)list為空時(shí),給id賦值一個(gè)-1,保證查不到數(shù)據(jù),sql也沒有語(yǔ)法錯(cuò)誤。 

foreach用法 List和Array,對(duì)象

向sql傳遞數(shù)組或List,mybatis使用foreach解析

foreach元素的屬性主要有item,index,collection,open,separator,close。

  • item:集合中元素迭代時(shí)的別名,該參數(shù)為必選。
  • index:在list和數(shù)組中,index是元素的序號(hào),在map中,index是元素的key,該參數(shù)可選
  • open:foreach代碼的開始符號(hào),一般是(和close=")"合用。常用在in(),values()時(shí)。該參數(shù)可選
  • separator:元素之間的分隔符,例如在in()的時(shí)候,separator=","會(huì)自動(dòng)在元素中間用“,“隔開,避免手動(dòng)輸入逗號(hào)導(dǎo)致sql錯(cuò)誤,如in(1,2,)這樣。該參數(shù)可選。
  • close:foreach代碼的關(guān)閉符號(hào),一般是)和open="("合用。常用在in(),values()時(shí)。該參數(shù)可選。

collection:foreach的時(shí)候最關(guān)鍵的也是最容易出錯(cuò)的就是collection屬性,該屬性是必須指定的,但是在不同情況 下,該屬性的值是不一樣的

主要有一下3種情況:

1. 如果傳入的是單參數(shù)且參數(shù)類型是一個(gè)List的時(shí)候,collection屬性值為list

2. 如果傳入的是單參數(shù)且參數(shù)類型是一個(gè)array數(shù)組的時(shí)候,collection的屬性值為array

3. 如果使用Map封裝了,collection的屬性值為對(duì)應(yīng)的Key

1、array數(shù)組的類型

UserMapper.java

List<User> findUser_array(int [] ids)throws Exception;

UserMapper.xml

<!--單參數(shù)array數(shù)組的類型-->?
? <select id="findUser_array" resultType="com.xiaomin.page.pojo.User">?
? ? select * from sys_user?
? ? ? ? <where>?
? ? ? ? ? ? <foreach collection="array" item="item" open="and id in(" separator="," close=")">?
? ? ? ? ? ? ? ? ?#{item}?
? ? ? ? ? ? </foreach>?
? ? ? ? </where>?
? </select>

Controller.java

@RequestMapping("/findUser_array")?
? @ResponseBody?
? public List<User> foreach_test()throws Exception{?
? ? int [] ids=new int[]{1,2,3};?
? ? List<User> list = userMapper.findUser_array(ids);?
? ? return list;?
}

示例:

2、list的類型

UserMapper.java

List<User> findUser_list(List<Integer>list)throws Exception;

UserMapper.xml

<!--list類型-->?
? ? <select id="findUser_list" resultType="com.xiaomin.page.pojo.User">?
? ? select * from sys_user?
? ? <where>?
? ? ? ? <foreach collection="list" item="user_id" open="and id in(" separator="," close=")">?
? ? ? ? ? ? #{user_id}?
? ? ? ? </foreach>?
? ? </where>?
? </select>

Controller.java

/**
?* list類型
?* @return
?* @throws Exception
?*/?
? @RequestMapping("/findUser_list")?
? @ResponseBody?
? public List<User> findUser_list()throws Exception{?
? ? List<User> list = userMapper.findUser_list(Arrays.asList(new Integer[]{1,2,3,6}));?
? ? return list;?
}

測(cè)試截圖: 

3、對(duì)象類型

UserMapper.java

List<User> findUser_obj(UserQueryVo vo)throws Exception;

UserMapper.xml

<!--對(duì)象類型-->?
? <select id="findUser_obj" parameterType="com.xiaomin.page.pojo.vo.UserQueryVo" resultType="com.xiaomin.page.pojo.User">?
? ? select * from sys_user?
? ? ? ? <where>?
? ? ? ? ? ? <if test="ids !=null">?
? ? ? ? ? ? ? ? <foreach collection="ids" item="user_id" open="and id in (" separator="," close=")">?
? ? ? ? ? ? ? ? ? ? #{user_id}?
? ? ? ? ? ? ? ? </foreach>?
? ? ? ? ? ? </if>?
? ? ? ? </where>?
? </select>

Controller.java

/**
?* 對(duì)象類型
?* @return
?* @throws Exception
?*/?
? @RequestMapping("/findUser_obj")?
? @ResponseBody?
? public List<User> findUser_obj()throws Exception{
?
? ? List<Integer> ids = new ArrayList<>();?
? ? ids.add(1);?
? ? ids.add(2);?
? ? ids.add(3);
?
? ? UserQueryVo queryVo = new UserQueryVo();?
? ? queryVo.setIds(ids);?
? ? List<User> list = userMapper.findUser_obj(null);?
? ? return list;?
}

測(cè)試截圖:

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

相關(guān)文章

  • MyBatis注解實(shí)現(xiàn)動(dòng)態(tài)SQL問題

    MyBatis注解實(shí)現(xiàn)動(dòng)態(tài)SQL問題

    這篇文章主要介紹了MyBatis注解實(shí)現(xiàn)動(dòng)態(tài)SQL問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • java版十大排序經(jīng)典算法:完整代碼(2)

    java版十大排序經(jīng)典算法:完整代碼(2)

    優(yōu)秀的文章也不少,但是Java完整版的好像不多,我把所有的寫一遍鞏固下,同時(shí)也真誠(chéng)的希望閱讀到這篇文章的小伙伴們可以自己去從頭敲一遍,不要粘貼復(fù)制!希望我的文章對(duì)你有所幫助,每天進(jìn)步一點(diǎn)點(diǎn)
    2021-07-07
  • Spring Security 圖片驗(yàn)證碼功能的實(shí)例代碼

    Spring Security 圖片驗(yàn)證碼功能的實(shí)例代碼

    spring security是一系列的過濾器鏈,所以在這里驗(yàn)證碼也聲明為過濾器,加在過濾器鏈的 登錄過濾器之前,然后自定義一個(gè)異常類,來響應(yīng)驗(yàn)證碼的錯(cuò)誤信息.這篇文章主要介紹了Spring Security 圖片驗(yàn)證碼,需要的朋友可以參考下
    2018-03-03
  • Java類成員訪問權(quán)限控制知識(shí)總結(jié)

    Java類成員訪問權(quán)限控制知識(shí)總結(jié)

    這篇文章主要介紹了Java類成員訪問權(quán)限控制知識(shí)總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 一篇文章弄懂Mybatis中#和$的區(qū)別

    一篇文章弄懂Mybatis中#和$的區(qū)別

    mybatis為我們提供了兩種支持動(dòng)態(tài)sql的語(yǔ)法#{}以及${},兩者都是動(dòng)態(tài)的向sql語(yǔ)句中傳入需要的參數(shù),下面這篇文章主要給大家介紹了如何通過一篇文章弄懂Mybatis中#和$區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • Java Spring Controller 獲取請(qǐng)求參數(shù)的幾種方法詳解

    Java Spring Controller 獲取請(qǐng)求參數(shù)的幾種方法詳解

    這篇文章主要介紹了Java Spring Controller 獲取請(qǐng)求參數(shù)的幾種方法詳解的相關(guān)資料,這里提供了6種方法,需要的朋友可以參考下
    2016-12-12
  • Java基礎(chǔ)-封裝和繼承

    Java基礎(chǔ)-封裝和繼承

    這篇文章主要介紹了Java面向?qū)ο缶幊蹋ǚ庋b/繼承/多態(tài))實(shí)例解析的相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下希望可以幫助到你
    2021-07-07
  • 解析探秘fescar分布式事務(wù)實(shí)現(xiàn)原理

    解析探秘fescar分布式事務(wù)實(shí)現(xiàn)原理

    這篇文章主要為大家解析探秘fescar分布式事務(wù)的實(shí)現(xiàn)原理,fescar的txc模型實(shí)現(xiàn)非常有研究的價(jià)值,所以今天我們來好好翻一翻fescar項(xiàng)目的代碼
    2022-02-02
  • Java實(shí)現(xiàn)SHA-256加密算法的完全解析

    Java實(shí)現(xiàn)SHA-256加密算法的完全解析

    SHA-256是一種散列(哈希)算法,用于將任意長(zhǎng)度的數(shù)據(jù)映射為固定長(zhǎng)度的散列值,以保證數(shù)據(jù)完整性。本文將為大家介紹一下SHA-256加密算法的原理與實(shí)現(xiàn),希望對(duì)大家有所幫助
    2023-02-02
  • Oracle JDBC連接BUG解決方案

    Oracle JDBC連接BUG解決方案

    這篇文章主要介紹了Oracle JDBC連接BUG解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10

最新評(píng)論