1. 程式人生 > >mybatis中關於${}和#{}取值的區別

mybatis中關於${}和#{}取值的區別

占位符 屬性 dstat 不能識別 other state its sql語句 numeric

1.相同點:

  #{}:都可以獲取map中的值或者pojo對象屬性的值;
  ${}:都可以獲取map中的值或者pojo對象屬性的值;

區別:  

  #{}:是以預編譯的形式,將參數設置到sql語句中(?,?,?)的形式,相當於原生JDBC中的PreparedStatement,可以防止sql註入;

  ${}:取出的值直接拼接在sql語句中,會有安全問題

建議: 大多數情況下,我們去參數的值都應該去使用#{};

${}的使用:

  原生jdbc不支持占位符的地方我們就可以使用${}進行取值
比如分表、排序。。。;按照年份分表拆分
select * from ${year}_salary where xxx;

select * from tbl_employee order by ${f_name} ${order}

#{}:更豐富的用法:
規定參數的一些規則:
javaType、 jdbcType、 mode(存儲過程)、 numericScale、
resultMap、 typeHandler、 jdbcTypeName、 expression(未來準備支持的功能);

jdbcType通常需要在某種特定的條件下被設置:
在我們數據為null的時候,有些數據庫可能不能識別mybatis對null的默認處理。比如Oracle(報錯);
(在我們向數據庫插入一條數據時,有些字段為空時,在mysql下可以正常插入,不考慮數據庫的約束情況,在oracle下插入時有會爆jdbc Type OTHER的錯誤,因為mybaits

默認情況下是jdbc Type OTHER類型的,oracle不支持該類型),所以只要在下列加上一句oracle支持的類型jdbcType=null就可以成功的插入到oracle數據中

技術分享圖片
JdbcType OTHER:無效的類型;因為mybatis對所有的null都映射的是原生Jdbc的OTHER類型,oracle不能正確處理;

由於全局配置中:jdbcTypeForNull=OTHER;oracle不支持;兩種辦法
1、#{email,jdbcType=OTHER};
2、jdbcTypeForNull=NULL
<setting name="jdbcTypeForNull" value="NULL"/>

mybatis中關於${}和#{}取值的區別