問題
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后的模糊條件 必須是字符串