Mybatis SQL字符串转换为数组

工作上的问题 专栏收录该内容
1 篇文章 0 订阅

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. 若转附链,谢谢! ↩︎

  • 2
    点赞
  • 1
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值