-
單個參數:mybatis不會做特殊處理
- 取值方式:#{參數名} 這里參數名不必與方法的形參名稱一致,可以用任意參數名來接受實參
- 例子:方法:update(Integer id) sql映射文件取值#{a},這樣也可以取到值
-
多個參數:mybatis會做特殊處理,即把多個參數封裝成一個map ,key:param1....paramN,value:傳入的參數值,#{}就是就是從map中獲取指定的key的value,即#{param1},#{param2}等
-
多個參數處理:自定義封裝參數的key
- 方法 get(@Param("id") Integer id,@Param("name") String name) key使用@Param注解指定的值
- 取值:#{id},#{name} #{自定的key}取出對應的值
-
如果多個參數正好是我們業務邏輯的數據模型(可以只是模型的部分數據)就可以直接傳入pojo
- #{屬性名}取出傳入的pojo屬性值
-
如果多個參數不是我們我們業務邏輯的模型,沒有對應的pojo,不推薦為了方便,我們可以傳入map
- #{key}取出map中對應的值
-
如果多個參數不是我們我們業務邏輯的模型,但是經常使用,推薦封裝成一個vo(其實就是一個簡單的javabean,把所有參數封裝到一個java類中)
-
如果形參只有一個,但是形參的類型是集合(collection,list,set)或者數組,也會做特殊處理,把它們封裝到map中
- 如果形參是collection,那么map的key是collection
- 如果是collection中的list,那么map的key是list,取值#{list[0]},表示取出list中第一個元素
- 如果是數組,那么map的key是array,取值#{array}
-
#{}取值和${}取值的區別
- #{}是以預編譯的形式,將參數設置到sql中 ,利用preparedStatement,防止sql注入
- ${},取出的值直接拼在sql中,有安全問題
- 原生jdbc不支持占位符的地方zhi能用${}取值,比如分表、排序等
-
#{}更豐富的用法
-
規定參數的一下規則:javaType、 jdbcType、 mode(存儲過程)、 numericScale、
resultMap、 typeHandler、 jdbcTypeName、 expression(未來准備支持的功能) -
jdbcType:數據庫類型:通常需要在某種特定的條件下被設置:
-
在我們數據為null的時候,有些數據庫可能不能識別mybatis對null的默認處理。比如Oracle(報錯);
-
JdbcType OTHER:無效的類型;因為mybatis對所有的null都映射的是原生Jdbc的OTHER類型,oracle不能正確處理;
-
由於全局配置中:jdbcTypeForNull=OTHER;oracle不支持;兩種辦法
-
#{email,jdbcType=OTHER};
-
jdbcTypeForNull=NULL
<setting name="jdbcTypeForNull" value="NULL"/>
-
-
-