mybatis 在對 sql 語句進行預編譯之前,會對 sql 進行動態解析,解析為乙個 boundsql 物件,也是在此處對動態 sql 進行處理的。在動態 sql 解析階段, # 和 $ 會有不同的表現:
select * from user where name = #;
#{} 在動態解析的時候, 會解析成乙個引數標記符。就是解析之後的語句是:
select * from user where name = ?;
那麼我們使用 ${}的時候
select * from user where name = '$';
${}在動態解析的時候,會將我們傳入的引數當做string字串填充到我們的語句中,就會變成下面的語句
select * from user where name = "dato";
預編譯之前的 sql 語句已經不包含變數了,完全已經是常量資料了。相當於我們普通沒有變數的sql了。
綜上所得, $ 變數的替換階段是在動態 sql 解析階段,而 #變數的替換是在 dbms 中。
這是 #{} 和 ${} 我們能看到的主要的區別,除此之外,還有以下區別:
#方式能夠很大程度防止sql注入。
$方式無法防止sql注入。
$方式一般用於傳入資料庫物件,例如傳入表名.
簡單的說#{}這種方式sql語句是經過預編譯的,它是把#{}中間的引數轉義成字串,再如:
select * from student where student_name = #
預編譯後,會動態解析成乙個引數標記符?:
select * from student where student_name = ?
而使用${}在動態解析時候,會傳入引數字串,原樣傳入,不能防止sql注入
select * from student where student_name = 'lyrics'
#{} 這種取值是編譯好sql語句再取值
${} 這種是取值以後再去編譯sql語句
sql注入參考:sql注入示例
Mybatis傳參方式
mybatis傳多個引數 三種解決方案 據我目前接觸到的傳多個引數的方案有三種。第一種方案 dao層的函式方法 1public user selectuser string name,string area 123select from user user t where user name and...
mybatis傳參總結
這種型別的文章比較多,再次只是自己的乙個總結 最常見的傳參方式應該是在xml中的屬性 parametertype 如果是基本型別,那麼在xml中使用 的方式就可以把引數值取出來了 如果是實體型別,比如說是自己封裝的pojo,那麼還是用上面的方式就可以去出來 現在當前的要求是需要傳入兩個引數,乙個是s...
MyBatis 推薦的傳參方式
介面方法 int getagebyid integer id xml對映檔案 select age from user where user id 介面方法 user login param username string username,param password string passwor...