mybatisin查询传⼊String⽅式
mybatis in查询传⼊String
在使⽤ mybaits 进⾏ in 查询时,传⼊String,如1,2,3,发现查询的结果并⾮我们想要的
这是因为#{}编译完⾃动加双引号“” 也就是变成in (“1,2,3”)
如果想要获得我们想要的结果,可以使⽤${},编译完是这样的 in (1,2,3)
例如,查询铃⾳库中多⾸铃⾳的总数量
<select id="getProgsResourceCount" resultType="java.lang.Long"
parameterType="ity.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>
如果传⼊参数是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查询传⼊字符串参数
sql⾥的in操作符允许我们在where⼦句中规定多个值进⾏匹配。
语法:
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
在mybatis⾥,可以通过传⼊数组或容器(array、list、set、map)通过foreach标签来给in操作符指定参数。
问题:想要从org表中匹配字段org_id在OR001、OR002、OR004中的数据,org_id是字符串类型的字段。
常规⽅法是在mapper.java中传⼊⼀个包含"OR001"、“OR002”、"OR004"的list对象orgIdList,在xml中:
SELECT * from org where org_id in
<foreach item="orgId" index="index" collection="orgIdList" open="(" close=")" separator=",">
#{orgId}
</foreach>
如果要作为in的匹配参数的多个值在⼀个String类型的对象orgs中,想直接通过String传⼊,有两种实现⽅式。
1、在xml中⽤${orgs}把整个String作为sql的⼀部分
SELECT * from org where org_id in (${orgs})
这种写法需要关注字符串orgs的内容在拼⼊之后,整个sql是否是符合语法的,按上⾯的需求和sql写法,就要求作为sql⼀部分的orgs的值为"‘OR001',‘OR002',‘OR004'"。
参数直接以sql⼀部分的⽅式作为查询语句存在sql注⼊的风险,有⼀些项⽬可能会⼀⼑切地限制开发者不允许⽤这种写法。
2、在xml的foreach标签⾥,传⼊collection属性时将字符串⽤split函数转为数组
SELECT * from org where org_id in
<foreach item="orgId" index="index" collection="orgs.split(',')" open="(" close=")" separator=",">
#{orgId}
</foreach>
sql 字符串转数组在这⾥传⼊的orgs字符串的值可以为"OR001,OR002,OR004",在调⽤split函数时设置","分格,可以直接切分出三个字符串作为数组的元素。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。