動态SQL是mybatis的強大特性之一,mybatis在對sql語句進行預編譯之前,會對sql進行動态解析,解析為一個BoundSql對象,也是在此處對動态sql進行處理。
在動态sql解析過程,#{} 與 ${} 的效果是不一樣的:
1. #{ } 解析為一個 JDBC 預編譯語句(prepared statement)的參數标記符 ?。
select * from user where = #{id};
// 會被解析為: select * from user where id = ?;
#{} 被解析為一個參數占位符?
2. ${ } 僅僅是String替換,在動态 SQL 解析階段将會進行變量替換
select * from user where id = ${id};
// 若傳入 id="12"
// 變成 select * from user where id = "12"
雖然id是int類型,但是此時我們仍要傳String類型,new Integer(id).toString(), 預編譯之前的sql語句已經不包含變量name。
總結:
1. ${ } 的變量的替換階段是在動态 SQL 解析階段,而 #{ }的變量的替換是在DBMS中(在解析階段變成 ‘?’)