mybatis查詢無結(jié)果, 數(shù)據(jù)庫運行相同sql查詢出結(jié)果

一、問題描述

mybatis查詢無結(jié)果, 數(shù)據(jù)庫運行相同sql查詢出結(jié)果, 如下

  • 這是數(shù)據(jù)庫記錄


    image.png
  • 這是mybatis查詢出的結(jié)果, 記錄條數(shù)0


    image.png
  • 這是直接將控制臺一模一樣的sql查詢語句放到Navicat執(zhí)行的結(jié)果, 記錄條數(shù)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>

可以看到, 查詢結(jié)果一致


image.png

三、異常分析

  1. 很多小伙伴都遇到過類似問題, 很懵逼, 難不成mybatis bug? 沒, 原因可能千萬種, 但根本原因基本上就一個, 那就是實際查詢語句與我們看到的sql不一致, 即, sql寫的有問題

  2. 再來分析一下上面這個問題, 看似xml sql沒有問題, 控制臺打印的sql也沒問題, 但放到數(shù)據(jù)庫執(zhí)行結(jié)果就不一致了, 因為, xml sql兩個條件換行了, mybatis實際執(zhí)行的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' 

查詢結(jié)果自然不一致

四、總結(jié)

本文只是提供一種解決類似問題的思路, 出錯原因可能不一樣, 但問題關(guān)鍵就是實際執(zhí)行的sql不一致, 才會導(dǎo)致mybatis和mysql查詢結(jié)果不一致, 所以, 仔細(xì)點, 檢查sql

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容