天天看點

mybatis 動态擷取參數拼接sql 字段作為參數傳遞

動态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中(在解析階段變成 ‘?’)