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


  1. 若转附链,谢谢! ↩︎

回答: 在MyBatis中,可以使用字符串分割成数组的方法来实现。根据引用\[1\]和引用\[2\]的代码片段,可以看出可以使用MyBatis的foreach标签和split函数来实现字符串分割成数组的功能。首先,判断字符串参数是否为空或者不为空字符串,然后再判断字符串参数中是否包含逗号。如果包含逗号,则使用foreach标签将字符串参数按逗号分割成数组,并将数组中的每个元素作为参数传递给SQL语句。如果不包含逗号,则直接将字符串参数作为参数传递给SQL语句。这样就可以实现将字符串分割成数组的功能。 #### 引用[.reference_title] - *1* [mybatis传入字符串分割成数组并且遍历(并判断是否包含逗号)](https://blog.csdn.net/mm445296564/article/details/109525494)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [mybatis传入字符串分割成数组并且遍历](https://blog.csdn.net/yumuxixi/article/details/78085540)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值