一、問題描述
mybatis查詢無結果, 數據庫運行相同sql查詢出結果, 如下
-
這是數據庫記錄

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

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

二、解決辦法
將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>
可以看到, 查詢結果一致

三、異常分析
-
很多小伙伴都遇到過類似問題, 很懵逼, 難不成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}, 實際應該使用#{}
