Mybatis #{} 與 ${} 區別

動態sql是mybatis的強大特性之一,也是它優於其餘 ORM 框架的一個重要緣由。mybatis 在對 sql 語句進行預編譯以前,會對 sql 進行動態解析,解析爲一個 BoundSql 對象,也是在此處對動態 SQL 進行處理的。sql

在動態 SQL 解析階段, #{ } 和 ${ } 會有不一樣的表現:mybatis

#{ } 解析爲一個 JDBC 預編譯語句(prepared statement)的參數標記符。框架

例如,sqlMap 中的 sql 語句code

select * from user where name = #{name};

解析爲:對象

select * from user where name = ?;

一個 #{ } 被解析爲一個參數佔位符 ? 。ip

 

${ } 僅僅爲一個純碎的 String 替換,在動態 SQL 解析階段將會進行變量替換編譯

例如,sqlMap 中以下的 sqlclass

select * from user where name = ${name};

當咱們傳遞的參數爲 "wang" 時,上述 sql 的解析爲:變量

select * from user where name = "wang";

預編譯以前的 SQL 語句已經不包含變量 name 了。select

綜上所得, ${ } 的變量的替換階段是在動態 SQL 解析階段,而 #{ }的變量的替換是在 DBMS 中。

因此:#{} 能夠防止sql注入。

Tips

1. 能使用 #{ } 的地方就用 #{ }

2. 表名做爲變量時,必須使用 ${ }

相關文章
相關標籤/搜索