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