天天看點

mybatis 列印sql_不敢相信,相同 SQL 下 Mybatis 查詢結果和資料庫竟然不一樣!

  • 一、問題描述
  • 二、解決辦法
  • 三、異常分析
  • 四、總結
  • 《Java 2019 超神之路》
  • 《Dubbo 實作原理與源碼解析 —— 精品合集》
  • 《Spring 實作原理與源碼解析 —— 精品合集》
  • 《MyBatis 實作原理與源碼解析 —— 精品合集》
  • 《Spring MVC 實作原理與源碼解析 —— 精品合集》
  • 《Spring Boot 實作原理與源碼解析 —— 精品合集》
  • 《資料庫實體設計合集》
  • 《Java 面試題 —— 精品合集》
  • 《Java 學習指南 —— 精品合集》

一、問題描述

mybatis查詢無結果, 資料庫運作相同sql查詢出結果, 如下

  • 這是資料庫記錄
mybatis 列印sql_不敢相信,相同 SQL 下 Mybatis 查詢結果和資料庫竟然不一樣!
  • 這是mybatis查詢出的結果, 記錄條數0
mybatis 列印sql_不敢相信,相同 SQL 下 Mybatis 查詢結果和資料庫竟然不一樣!
  • 這是直接将控制台一模一樣的sql查詢語句放到Navicat執行的結果, 記錄條數1
mybatis 列印sql_不敢相信,相同 SQL 下 Mybatis 查詢結果和資料庫竟然不一樣!

二、解決辦法

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 列印sql_不敢相信,相同 SQL 下 Mybatis 查詢結果和資料庫竟然不一樣!

三、異常分析

  1. 很多小夥伴都遇到過類似問題, 很懵逼, 難不成mybatis bug? 沒, 原因可能千萬種, 但根本原因基本上就一個, 那就是實際查詢語句與我們看到的sql不一緻, 即, sql寫的有問題
  2. 再來分析一下上面這個問題, 看似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}

, 實際應該使用

#{}

來源:http://jianshu.com/p/7c569ca6852e

  • 《Java 2019 超神之路》
  • 《Dubbo 實作原理與源碼解析 —— 精品合集》
  • 《Spring 實作原理與源碼解析 —— 精品合集》
  • 《MyBatis 實作原理與源碼解析 —— 精品合集》
  • 《Spring MVC 實作原理與源碼解析 —— 精品合集》
  • 《Spring Boot 實作原理與源碼解析 —— 精品合集》
  • 《資料庫實體設計合集》
  • 《Java 面試題 —— 精品合集》
  • 《Java 學習指南 —— 精品合集》

繼續閱讀