mybatis利用动态SQL进行模糊查询遇到的问题
问题
mybatis利用动态SQL进行模糊查询, 但查询的结果始终是0行, 经过分析发现了问题所在
场景
我使用的是mybatis-plus
图组1 表结构及索引
图2 userMapper接口
key是模糊查询的字段如username, phone, email
value是模糊值, 如sss, 然后使用动态SQL组合成%sss%
图3 错误的SQL语句
其中<bind>是为了拼接模糊查询的条件, 为了防止SQL注入不能使用%${}%的写法, 查询
图4 始终没有查询到结果
解决
先开启控制台打印mybatis执行的SQL语句
图5 mybatis-plus开启执行SQL的日志
mybatis-plus即配置log-impl即可log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis原生可自行搜索mybatis 显示执行的SQL语句
运行, 分析控制台输出结果
图6 控制台输出结果
整体来说SQL没有写错, 模糊查询的%也连接正常
经过仔细发现username字段是一个字符串类型, 而平常写SQL条件查找好像从来没写过字符串, 我用navicat做了一下实验
图7 username条件为字符串时
图8 username条件不是字符串时
到这里我才明白了, 条件的字段不能写成字符串, 因为以前没遇到过这样的问题
修改mapper, 先用动态SQL的if判断字符串
图9 修改后的mapper
重启一下服务, 再进行查询
图10 效果
可以正常运行并能正确返回匹配模糊条件的结果
总结
用SQL进行模糊查询, 需要注意
图11 注意
where后的字段必须 不能是字符串
like后的模糊条件 必须是字符串

浙公网安备 33010602011771号