1. 程式人生 > >Mybatis中#與$的區別

Mybatis中#與$的區別

根據 class select ssi 什麽 jdb 解析 lec 後臺

1.兩者都是動態的向sql語句中傳入需要的參數

2.#傳入的參數在SQL中顯示為字符串

eg:select id,name,age from student where id =#{id},當前端把id值1,傳入到後臺的時候,就相當於 select id,name,age from student where id =‘1‘.

3.$傳入的參數在SqL中直接顯示為傳入的值

eg:select id,name,age from student where id =${id},當前端把id值1,傳入到後臺的時候,就相當於 select id,name,age from student where id = 1.

4.#可以防止SQL註入的風險(語句的拼接)

5.但是如果使用在order by 中就需要使用 $.

我覺得#與的區別最大在於:#{} 傳入值時,sql解析時,參數是帶引號的,而的區別最大在於:#{} 傳入值時,sql解析時,參數是帶引號的,而{}穿入值,sql解析時,參數是不帶引號的。

一 : 理解mybatis中 $與#

在mybatis中的$與#都是在sql中動態的傳入參數。

eg:select id,name,age from student where name=#{name} 這個name是動態的,可變的。當你傳入什麽樣的值,就會根據你傳入的值執行sql語句。

二:使用$與#

#{}: 解析為一個 JDBC 預編譯語句(prepared statement)的參數標記符,一個 #{ } 被解析為一個參數占位符 。

${}: 僅僅為一個純碎的 string 替換,在動態 SQL 解析階段將會進行變量替換。

傳入一個不改變的字符串或者傳入數據庫字段(列名),例如要傳入order by 後邊的參數

這種情況下必須使用${}。

綜上,#{}方式一般用於傳入字段值,並將該值作為字符串加到執行sql中,一定程度防止sql註入;

${}方式一般用於傳入數據庫對象,例如傳入表名,不能防止sql註入,存在風險。

模糊查詢中,如果使用如下方式:select * from reason_detail where reason_en like ‘%${reason}%‘,此處只能使用$,使用#的話,反而會被解析為列,報錯java.sql.SQLException: Column ‘reason‘ not found

Mybatis中#與$的區別