您好,登錄后才能下訂單哦!
mybatis查詢無結果, 數據庫運行相同sql查詢出結果, 如下
這是數據庫記錄
image.png
這是mybatis查詢出的結果, 記錄條數0
image.png
這是直接將控制臺一模一樣的sql查詢語句放到Navicat執行的結果, 記錄條數1
image.png
將where
條件后的username = '${username}'
和and password = '${password}'
置為同一行
????<select?id="selectByUsernameAndPassword"?resultMap="BaseResultMap"?parameterType="string"> ????????SELECT ????????<include?refid="Base_Column_List"?/> ????????FROM?user ????????where?username?=?'${username}' ????????and?password?=?'${password}' ????</select>
????<select?id="selectByUsernameAndPassword"?resultMap="BaseResultMap"?parameterType="string"> ????????SELECT ????????<include?refid="Base_Column_List"?/> ????????FROM?user ????????where?username?=?'${username}'?and?password?=?'${password}' ????</select>
可以看到, 查詢結果一致
image.png
很多小伙伴都遇到過類似問題, 很懵逼, 難不成mybatis bug? 沒, 原因可能千萬種, 但根本原因基本上就一個, 那就是實際查詢語句與我們看到的sql不一致, 即, sql寫的有問題
再來分析一下上面這個問題, 看似xml sql沒有問題, 控制臺打印的sql也沒問題, 但放到數據庫執行結果就不一致了, 因為, xml sql兩個條件換行了, mybatis實際執行的sql是這樣的:
SELECT?id,?username,?password?FROM?user?where?username?=?'aaa'?#?''?and?password?=?'xxx'
并不是控制臺打印的sql:
SELECT?id,?username,?password?FROM?user?where?username?=?'aaa'?#?''?and?password?=?'xxx'
查詢結果自然不一致
本文只是提供一種解決類似問題的思路, 出錯原因可能不一樣, 但問題關鍵就是實際執行的sql不一致, 才會導致mybatis和mysql查詢結果不一致, 所以, 仔細點, 檢查sql
另, 本文是為了測試sql注入, 所以用的${username}
, 實際應該使用#{}
點擊獲取?附送學習進階架構資料、PDF書籍文檔、面試資料
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。