mybatis利用动态SQL进行模糊查询遇到的问题

问题

mybatis利用动态SQL进行模糊查询, 但查询的结果始终是0行, 经过分析发现了问题所在

场景

我使用的是mybatis-plus


mybatis利用动态SQL进行模糊查询遇到的问题
mybatis利用动态SQL进行模糊查询遇到的问题
图组1 表结构及索引

mybatis利用动态SQL进行模糊查询遇到的问题
图2 userMapper接口

key是模糊查询的字段如username, phone, email
value是模糊值, 如sss, 然后使用动态SQL组合成%sss%


mybatis利用动态SQL进行模糊查询遇到的问题
图3 错误的SQL语句

其中<bind>是为了拼接模糊查询的条件, 为了防止SQL注入不能使用%${}%的写法, 查询


mybatis利用动态SQL进行模糊查询遇到的问题
图4 始终没有查询到结果

解决

先开启控制台打印mybatis执行的SQL语句


mybatis利用动态SQL进行模糊查询遇到的问题
图5 mybatis-plus开启执行SQL的日志

mybatis-plus即配置log-impl即可log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis原生可自行搜索mybatis 显示执行的SQL语句

运行, 分析控制台输出结果


mybatis利用动态SQL进行模糊查询遇到的问题
图6 控制台输出结果

整体来说SQL没有写错, 模糊查询的%也连接正常

经过仔细发现username字段是一个字符串类型, 而平常写SQL条件查找好像从来没写过字符串, 我用navicat做了一下实验


mybatis利用动态SQL进行模糊查询遇到的问题
图7 username条件为字符串时

mybatis利用动态SQL进行模糊查询遇到的问题
图8 username条件不是字符串时

到这里我才明白了, 条件的字段不能写成字符串, 因为以前没遇到过这样的问题

修改mapper, 先用动态SQL的if判断字符串


mybatis利用动态SQL进行模糊查询遇到的问题
图9 修改后的mapper

重启一下服务, 再进行查询


mybatis利用动态SQL进行模糊查询遇到的问题
图10 效果

可以正常运行并能正确返回匹配模糊条件的结果

总结

用SQL进行模糊查询, 需要注意


mybatis利用动态SQL进行模糊查询遇到的问题
图11 注意

where后的字段必须 不能是字符串
like后的模糊条件 必须是字符串

mybatis利用动态SQL进行模糊查询遇到的问题

上一篇:MongoDB基础2


下一篇:linux 编译安装amqp