mybatis 查詢sql中in條件用法詳解(foreach)
foreach屬性主要有item,index,collection,open,separator,close
1、item表示集合中每一個元素進行迭代時的別名,
2、index指定一個名字,用于表示在迭代過程中,每次迭代到的位置,
3、open表示該語句以什么開始,
4、separator表示在每次進行迭代之間以什么符號作為分隔符,
5、close表示以什么結(jié)束,
6、collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,
主要有一下3種情況:
a、如果傳入的是單參數(shù)且參數(shù)類型是一個List的時候,collection屬性值為list .
b、如果傳入的是單參數(shù)且參數(shù)類型是一個array數(shù)組的時候,collection的屬性值為array .
c、如果傳入的參數(shù)是多個的時候,我們就需要把它們封裝成一個Map了,當(dāng)然單參數(shù)也可以封裝成map,實際上如果你在傳入?yún)?shù)的時候,在MyBatis里面也是會把它封裝成一個Map的,map的key就是參數(shù)名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map里面的key.
<select id="findBy" resultMap="RfCustomerMemMap" parameterType="java.util.Map">
SELECT
<include refid="Column"/>
FROM rfl_customer_mem a LEFT JOIN rfl_loan b ON a.member_no = b.loan_member_no
WHERE a.member_no = #{memberNo} AND b.status IN
<foreach collection="status" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
<if test="name != null and name != ''">
AND name = #{name}
</if>
<if test="idNumber != null and idNumber != ''">
AND id_number = #{idNumber}
</if>
<if test="mobileNo != null and mobileNo != ''">
AND mobile_no = #{mobileNo}
</if>
<if test="loanNo != null and loanNo != ''">
AND loan_no = #{loanNo}
</if>
order by a.id DESC
<if test="offset > -1 and rows > -1">
limit #{offset},#{limit}
</if>
</select>
java調(diào)用查詢sql代碼
public List<LoanMerchantMemEntity> findMerchantMemBy(String merchantName, String merchantNo, String socialCreditCode, String loanNo, int offset, int limit) {
List<LoanMerchantMemEntity> list = new ArrayList<LoanMerchantMemEntity>();
Map<String, Object> filter = new HashMap<String, Object>();
filter.put("merchantName", merchantName);
filter.put("socialCreditCode", socialCreditCode);
filter.put("status", statsList());
filter.put("loanNo", loanNo);
filter.put("offset", offset);
filter.put("limit", limit);
filter.put("merchantNo", merchantNo);
try {
List<LoanMerchantMemEntity> row = loanMerchantMemDao.findBy(filter);
} catch (Exception e) {
LOGGER.error(filter, "查詢企業(yè)會員信息異常", e);
}
return list;
}
static List<String> statsList(){
List<String> statusList = new ArrayList<String>();
statusList.add("SUCCESS");
statusList.add("DUE");
statusList.add("OVER");
return statusList;
}
其中,map中key為status值類型為list,這種使用場景為第三種,即collection為map中的key值
補充:當(dāng)傳入一個String數(shù)組后,在sql中使用foreach語句實現(xiàn)IN查詢
當(dāng)我們從前臺傳遞過來的是一個數(shù)組是,后臺我們要進行處理, 因為在數(shù)據(jù)庫中表的字段類型有可能是num 或者varchar;
我這里傳過來的是Map 當(dāng)然也可以使用request.getparameter("name") 這個name為jsp或者htm頁面中的id所對應(yīng)的name,
下面代碼中也是的:
String name=(String) params.get("name");
String[] hiddens = name.split(",");
params.put("name", hiddens);
當(dāng)我們經(jīng)過這一部分的處理后,數(shù)據(jù)就存入到map中了,傳入?yún)?shù)后進行查詢
AND 條件 in
<foreach collection="name" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
在sql上面,我們進行查詢的時候就OK啦!
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
SpringBoot+websocket實現(xiàn)消息對話功能
WebSocket是一種在Web應(yīng)用程序中實現(xiàn)實時雙向通信的技術(shù),它可以用于在線游戲、在線聊天、推送通知、實時監(jiān)控等,并且比傳統(tǒng)的輪詢技術(shù)更加高效和可靠,本文就給大家介紹基于SpringBoot+websocket實現(xiàn)消息對話功能,感興趣的小伙伴可以自己動手試一試2023-09-09
JDK源碼之線程并發(fā)協(xié)調(diào)神器CountDownLatch和CyclicBarrier詳解
我一直認為程序是對于現(xiàn)實世界的邏輯描述,而在現(xiàn)實世界中很多事情都需要各方協(xié)調(diào)合作才能完成,就好比完成一個平臺的交付不可能只靠一個人,而需要研發(fā)、測試、產(chǎn)品以及項目經(jīng)理等不同角色人員進行通力合作才能完成最終的交付2022-02-02
Java模擬單鏈表和雙端鏈表數(shù)據(jù)結(jié)構(gòu)的實例講解
這篇文章主要介紹了Java模擬單鏈表和雙端鏈表數(shù)據(jù)結(jié)構(gòu)的實例,注意這里的雙端鏈表不是雙向鏈表,是在單鏈表的基礎(chǔ)上保存有對最后一個鏈接點的引用,需要的朋友可以參考下2016-04-04
Spring Cloud Gateway組件的三種使用方式實例詳解
Spring Cloud Gateway是 Spring 官方基于 Spring5.0 、 SpringBoot2.0 和 Project Reactor 等技術(shù)開發(fā)的網(wǎng)關(guān)旨在為微服務(wù)框架提供一種簡單而有效的統(tǒng)一的API 路由管理方式,統(tǒng)一訪問接口,這篇文章主要介紹了Spring Cloud Gateway組件的三種使用方式,需要的朋友可以參考下2024-01-01
深入解讀Java代碼組織中的package包結(jié)構(gòu)
這篇文章主要介紹了Java代碼組織中的package包結(jié)構(gòu),是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2016-03-03
Java使用kafka發(fā)送和生產(chǎn)消息的示例
本篇文章主要介紹了Java使用kafka發(fā)送和生產(chǎn)消息的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04

