记一个挺有趣的 关于mybatis in入参的bug排查

本文记录了一个关于17年遗留代码中mybatis IN查询的bug,问题在于IDEA显示的入参中,两个字符串参数未显示类型,导致在执行SQL时出现了错误。原本应为两个独立的字符串'10100'和'10400',却被错误地合并成一个带有单引号的字符串"'10100','10400'",引发查询失败。正确解决方案是使用List<String>并通过mybatis的foreach遍历处理IN条件。" 111263759,10296227,AIOps时代:运维工程师的角色转变与职责,"['智能运维', 'AIOps', '运维自动化', '故障自愈', '机器学习']
摘要由CSDN通过智能技术生成

这个bug其实主要不在于写出来多奇怪

主要是排查的时候觉得蛮有趣的.

是一段17年遗留的老代码里面的.

最开始代码运行并未出现报错之类的. 只是某条20多个入参, 将近300多行的sql查询结果一直是0条记录.

但是使用传入的参数手动搜索是有查询结果的.

其实再idea控制台查看入参的时候,有个奇怪的小细节, 只是当时没注意, 不然就没有后面的事了.

idea显示的入参中间有两个参数显示是 '10100', '10400'(String) 用idea的控制台显示sql语句的param的时候, 会在每个参数后面用括号写出参数类型,唯独这个10100后面没有带类型, 而且idea控制台的param如果是string类型是不会'贴心'地加上单引号的. 况且, string类型加单引号很奇怪吧, Java的习惯单引号是字符, 此处应该是双引号才对.

但是当时的我没有注意到, 傻乎乎地以为这是两个简单的String入参.

于是, 我打开了Mybatis Log Plugin复制粘贴进数据库连接工具, 执行.

报错???en(此处应有第三声)???

查看报错信息, 将sql语句粘贴进txt, ctrl+f查找(实在太长orz), 发现 in("'10100','10400'")

哦豁?

再回头仔细一看, 很贴心的 10100和10400两个字符串被两头变成了一个"'10100','10400'"的字符串, 单引号和双引号是代码里面硬加上去的, 然后这个命运多舛的String--XXXCode被简单粗暴地塞进了in(#{XXXCode}).

orz, 请收下我的膝盖

作为接手的人, 排查真的不容易

 

题外话, 附上正确做法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值