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

posted @ 2020-08-09 17:37  FuKai  阅读(1181)  评论(0编辑  收藏  举报