11.22 一不小心,發現了Mybatis的一個坑

來源:https://url.cn/5bGWOIs

mybatis查詢無結果, 數據庫運行相同sql查詢出結果, 如下

這是數據庫記錄

一不小心,發現了Mybatis的一個坑

這是mybatis查詢出的結果, 記錄條數0

一不小心,發現了Mybatis的一個坑

這是直接將控制檯一模一樣的sql查詢語句放到Navicat執行的結果, 記錄條數1

一不小心,發現了Mybatis的一個坑

解決辦法

將 where條件後的 username='${username}'和 andpassword='${password}'置為同一行

一不小心,發現了Mybatis的一個坑

一不小心,發現了Mybatis的一個坑

可以看到, 查詢結果一致

一不小心,發現了Mybatis的一個坑

異常分析

  1. 很多小夥伴都遇到過類似問題, 很懵逼, 難不成mybatis bug? 沒, 原因可能千萬種, 但根本原因基本上就一個, 那就是實際查詢語句與我們看到的sql不一致, 即, sql寫的有問題
  2. 再來分析一下上面這個問題, 看似xml sql沒有問題, 控制檯打印的sql也沒問題, 但放到數據庫執行結果就不一致了, 因為, xml sql兩個條件換行了, mybatis實際執行的sql是這樣的:
一不小心,發現了Mybatis的一個坑

並不是控制檯打印的sql:

一不小心,發現了Mybatis的一個坑

查詢結果自然不一致

總結

本文只是提供一種解決類似問題的思路, 出錯原因可能不一樣, 但問題關鍵就是實際執行的sql不一致, 才會導致mybatis和mysql查詢結果不一致, 所以, 仔細點, 檢查sql

另, 本文是為了測試sql注入, 所以用的 ${username}, 實際應該使用 #{}

我自己是一名從事了多年開發的Java老程序員,辭職目前在做自己的Java私人定製課程,今年年初我花了一個月整理了一份最適合2019年學習的Java學習乾貨,從最基礎的JavaSE到Spring各種框架都有整理,送給每一位Java小夥伴,想要獲取的可以關注我的頭條號並在後臺私信我:Java,即可免費獲取。


分享到:


相關文章: