Mybatis SQL字符串转换为数组
Mybatis SQL字符串转换为数组
SQL语句
刚刚接手一个简单的需求,让前端数据类型能支持多选,简单想了一下,似乎挺简单的
后续查看别人的代码(在别人原来的基础上修改),发现问题并没有想象中简单
SQL语句想要支持多选,那就只能用IN操作符了
想象中的SQL语句是这样的:
SELECT * FROM works WHERE deal_result IS NULL
AND node_code IN ('Exception','OrderService') ;
注解:work是表名,node_code就是需要支持多选的字段
查看代码
既然是有对应数据库,那么一般都会有对应的数据库实体类,我查看了一下实体类对应的字段
这里是取的String类型
直接动手
不管三七二十一,直接上手
先在后端模拟了两个数据,放入node_code里,看看输出的SQL是什么
2019-08-14 16:15:13,759 Preparing: SELECT count(0) FROM work WHERE deal_result IS NULL AND node_code IN (?) AND FIND_IN_SET(?, process_user)
2019-08-14 16:15:13,760 Parameters: 'Exception','OrderService'(String), 8000001105(String)
‘Exception’,'OrderService’这两个数据就是我放进node_code里的,看上去是没啥问题,但是执行的SQL没有查询出任何数据
我又在Navicat里运行了一下SQL,查询出下面的数据
那么一定是某些地方出问题了,再回去看看控制台打印出的SQL和Navicat上的区别,发现两个数据只有一个类型,那么就是运行SQL时,把两个数据只当做一个数据来查询了
解决方法
要想解决上面的问题,得让string变成数组,再在mapper.xml里进行迭代
想法:先是把之前的字符串换成了数组
这样改了一下就发现做不下去了,这是别人的代码,一改动就得改动原来的查询方法,然后太多地方涉及到这个查询方法,改动太大
搞不好还需要改动原来的实体类,得不偿失
上网百度一下,发现更加简洁的方法
<if test="nodeCode != null and nodeCode != '' ">and node_code in
<foreach item="nodeCodestr" collection="nodeCode.split(',')" open="(" separator="," close=")">
#{nodeCodestr}
</foreach>
</if>
这里重要的点就是split(’,’),这个可以在这样直接使用
一开始使用的时候,用错了#{nodeCode},这是代码传到mapper.xml 的数据,是一个数组,得用item对应的nodeCodestr
所以要注意的是:collection和item,collection对应的是代码传来的参数,item就是下面用到的字符
若侵联删,谢谢。1
若转附链,谢谢! ↩︎