mybatis in查詢傳入String方式
mybatis in查詢傳入String
在使用 mybaits 進(jìn)行 in 查詢時(shí),傳入String,如1,2,3,發(fā)現(xiàn)查詢的結(jié)果并非我們想要的
這是因?yàn)?{}編譯完自動(dòng)加雙引號(hào)“” 也就是變成in (“1,2,3”)
如果想要獲得我們想要的結(jié)果,可以使用${},編譯完是這樣的 in (1,2,3)
例如,查詢鈴音庫(kù)中多首鈴音的總數(shù)量
<select id="getProgsResourceCount" resultType="java.lang.Long" parameterType="com.progandresource.entity.ProgsResourceCond"> select count(ring_no) from progandresmanage_ringinfo where valid_day > now() <if test="ringNo != '' and ringNo != null"> and ring_no in (${ringNo}) </if> </select>
如果傳入?yún)?shù)是List或者Array,則直接用foreach即可
例如
<select id="getProgsResourceCount" resultType="java.lang.Long" parameterType="java.util.List"> select count(ring_no) from progandresmanage_ringinfo where valid_day > now() and ring_no in <foreach collection="list" item="item" index="index" open="(" close=")" separator=","> #{item, jdbcType=VARCHAR} </foreach> </select>
mybatis in查詢傳入字符串參數(shù)
sql里的in操作符允許我們?cè)趙here子句中規(guī)定多個(gè)值進(jìn)行匹配。
語法:
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...);
在mybatis里,可以通過傳入數(shù)組或容器(array、list、set、map)通過foreach標(biāo)簽來給in操作符指定參數(shù)。
問題:想要從org表中匹配字段org_id在OR001、OR002、OR004中的數(shù)據(jù),org_id是字符串類型的字段。
常規(guī)方法是在mapper.java中傳入一個(gè)包含"OR001"、“OR002”、"OR004"的list對(duì)象orgIdList,在xml中:
SELECT * from org where org_id in <foreach item="orgId" index="index" collection="orgIdList" open="(" close=")" separator=","> #{orgId} </foreach>
如果要作為in的匹配參數(shù)的多個(gè)值在一個(gè)String類型的對(duì)象orgs中,想直接通過String傳入,有兩種實(shí)現(xiàn)方式。
1、在xml中用${orgs}把整個(gè)String作為sql的一部分
SELECT * from org where org_id in (${orgs})
這種寫法需要關(guān)注字符串orgs的內(nèi)容在拼入之后,整個(gè)sql是否是符合語法的,按上面的需求和sql寫法,就要求作為sql一部分的orgs的值為"‘OR001',‘OR002',‘OR004'"。
參數(shù)直接以sql一部分的方式作為查詢語句存在sql注入的風(fēng)險(xiǎn),有一些項(xiàng)目可能會(huì)一刀切地限制開發(fā)者不允許用這種寫法。
2、在xml的foreach標(biāo)簽里,傳入collection屬性時(shí)將字符串用split函數(shù)轉(zhuǎn)為數(shù)組
SELECT * from org where org_id in <foreach item="orgId" index="index" collection="orgs.split(',')" open="(" close=")" separator=","> #{orgId} </foreach>
在這里傳入的orgs字符串的值可以為"OR001,OR002,OR004",在調(diào)用split函數(shù)時(shí)設(shè)置","分格,可以直接切分出三個(gè)字符串作為數(shù)組的元素。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java解析DICOM圖之如何獲得16進(jìn)制數(shù)據(jù)詳解
DICOM就是醫(yī)學(xué)數(shù)字成像和通信,是醫(yī)學(xué)圖像和相關(guān)信息的國(guó)際標(biāo)準(zhǔn)(ISO 12052),下面這篇文章主要給大家介紹了關(guān)于Java解析DICOM圖之如何獲得16進(jìn)制數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-10-10Spring框架基于xml實(shí)現(xiàn)自動(dòng)裝配流程詳解
自動(dòng)裝配就是指?Spring?容器在不使用?<constructor-arg>?和<property>?標(biāo)簽的情況下,可以自動(dòng)裝配(autowire)相互協(xié)作的?Bean?之間的關(guān)聯(lián)關(guān)系,將一個(gè)?Bean?注入其他?Bean?的?Property?中2022-11-11Spring如何動(dòng)態(tài)自定義logback日志目錄詳解
這篇文章主要給大家介紹了關(guān)于Spring如何動(dòng)態(tài)自定義logback日志目錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10springboot遠(yuǎn)程執(zhí)行服務(wù)器指令
這篇文章主要介紹了springboot遠(yuǎn)程執(zhí)行服務(wù)器指令,本例是java遠(yuǎn)程連接到服務(wù)器,去抓取查詢kubesphere中的etcd日志,并返回,需要的朋友可以參考下2023-09-09Spring Bean的實(shí)例化之屬性注入源碼剖析過程
本篇文章主要就是分析Spring源碼剖析-Bean的實(shí)例化-屬性注入的相關(guān)知識(shí),通過本文學(xué)習(xí)AbstractAutowireCapableBeanFactory#populateBean 方法的主要功能就是屬性填充,感興趣的朋友跟隨小編一起看看吧2021-06-06詳談Array和ArrayList的區(qū)別與聯(lián)系
下面小編就為大家?guī)硪黄斦凙rray和ArrayList的區(qū)別與聯(lián)系。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06