问题
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后的模糊条件 必须是字符串