一译暂、問(wèn)題描述
mybatis查詢(xún)無(wú)結(jié)果, 數(shù)據(jù)庫(kù)運(yùn)行相同sql查詢(xún)出結(jié)果, 如下:
-
這是數(shù)據(jù)庫(kù)記錄
-
這是mybatis查詢(xún)出的結(jié)果, 記錄條數(shù)0
-
這是直接將控制臺(tái)一模一樣的sql查詢(xún)語(yǔ)句放到Navicat執(zhí)行的結(jié)果, 記錄條數(shù)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>
可以看到, 查詢(xún)結(jié)果一致
三、異常分析
- 很多小伙伴都遇到過(guò)類(lèi)似問(wèn)題, 很懵逼, 難不成mybatis bug? 沒(méi), 原因可能千萬(wàn)種, 但根本原因基本上就一個(gè), 那就是實(shí)際查詢(xún)語(yǔ)句與我們看到的sql不一致, 即, sql寫(xiě)的有問(wèn)題
- 再來(lái)分析一下上面這個(gè)問(wèn)題, 看似xml sql沒(méi)有問(wèn)題, 控制臺(tái)打印的sql也沒(méi)問(wèn)題, 但放到數(shù)據(jù)庫(kù)執(zhí)行結(jié)果就不一致了, 因?yàn)? xml sql兩個(gè)條件換行了, mybatis實(shí)際執(zhí)行的sql是這樣的:
SELECT id, username, password FROM user where username = 'aaa' # ''
and password = 'xxx'
并不是控制臺(tái)打印的sql:
SELECT id, username, password FROM user where username = 'aaa' # '' and password = 'xxx'
查詢(xún)結(jié)果自然不一致
四外永、總結(jié)
本文只是提供一種解決類(lèi)似問(wèn)題的思路, 出錯(cuò)原因可能不一樣, 但問(wèn)題關(guān)鍵就是實(shí)際執(zhí)行的sql不一致, 才會(huì)導(dǎo)致mybatis和mysql查詢(xún)結(jié)果不一致, 所以, 仔細(xì)點(diǎn), 檢查sql
另, 本文是為了測(cè)試sql注入, 所以用的${username}
, 實(shí)際應(yīng)該使用#{}
原文鏈接