1.Mybatis 的Mapper.xml語句中parameterType向SQL語句傳參有兩種方式:#{}和${}
我們經常使用的是#{},是因為這種方式可以防止SQL注入,#{}這種方式SQL語句是經過預編譯的,它把#{}中間的參數轉義成字符串。
比如:
select * from table where name = #{zhangSan}
預編譯后,會動態解析成一個參數標記符?:
select * from table where name = ?
而使用${}在動態解析時候,會傳入參數字符串
select * from table where name = ${zhangSan}
動態解析時候,會傳入參數字符串
select * from table where name = 'zhangSan'
我們經常使用的是#{},是因為這種方式可以防止SQL注入,#{}這種方式SQL語句是經過預編譯的,它把#{}中間的參數轉義成字符串。
比如:
select * from table where name = #{zhangSan}
預編譯后,會動態解析成一個參數標記符?:
select * from table where name = ?
而使用${}在動態解析時候,會傳入參數字符串
select * from table where name = ${zhangSan}
動態解析時候,會傳入參數字符串
select * from table where name = 'zhangSan'
總結:
#{} 這種取值是編譯好SQL語句再取值 即 #{}:動態解析 -> 預編譯 -> 執行
${} 這種是取值以后再去編譯SQL語句 即 ${}:動態解析 -> 編譯 -> 執行
#{} 這種取值是編譯好SQL語句再取值 即 #{}:動態解析 -> 預編譯 -> 執行
${} 這種是取值以后再去編譯SQL語句 即 ${}:動態解析 -> 編譯 -> 執行
#傳入的參數在SQL中顯示為字符串(當成一個字符串),會對自動傳入的數據加一個雙引號。
$傳入的參數在SqL中直接顯示為傳入的值
${ } 變量的替換階段是在動態 SQL 解析階段,而 #{ }變量的替換是在 DBMS 中。
2、#可以防止SQL注入的風險(語句的拼接);但$無法防止Sql注入。
3、$方式一般用於傳入數據庫對象,例如傳入表名。
4、大多數情況下還是經常使用#,一般能用#的就別用$;但有些情況下必須使用$,例:MyBatis排序時使用order by 動態參數時需要注意,用$而不是#。