一、单个参数:mybatis不会做特殊处理 —— 参数名可以定义任意名称
#{参数名}:取出参数
二、多个参数:mybatis会做特殊处理
当我们设置成:
(1)方法:public Employee getEmpByIdAndLastName(Integer id, String lastName);
(2)sql语句:where id=#{id} and last_name=#{lastName}
会报错异常:
org.apache.ibatis.binding.BindingException: Parameter 'id' not found.
Available parameters are [0, 1, param1, param2]
解决办法一:
多个参数会被封装成一个map:
(1)key:param1,…,paramN,或者参数的索引(从0开始)
(2)value:传入的参数值
#{param1}就是从mao中获取指定key的值
sql语句:where id=#{param1} and last_name=#{param2}
解决办法二:推荐!!!
命名参数:明确指定封装参数时map的key名称 —— @Param("id")
方法:getEmpByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastName);
sql语句:where id=#{id} and last_name=#{lastName}
多个参数会被封装成一个map:
(1)key:使用@Param注解指定的值
(2)value:传入的参数值
#{指定的key}就是从mao中获取指定key的值
POJO:
三、如果多个参数正好是业务逻辑的数据模型,我们就可以直接传入pojo
#{属性名}
:取出传入的pojo的属性值
Map:
四、如果多个参数不是业务逻辑的数据模型,没有对应的pojo
不经常使用时,我们可以一传入map
#{key}
:取出map中对应的值
TO:
五、如果多个参数不是业务逻辑的数据模型,没有对应的pojo
经常要使用,推荐编写一个TO(Transfer Object)数据传输对象
Page{
int index;
int size;
}
六、#{ }
和${ }
:都可以获取map中的值或者pojo对象属性的值
1.区别:
(1)#{ }
:以预编译的形式,将参数设置到sql语句中 PreparedStatement ==> 可以防止sql注入
select * from tbl_employee where id=#{id} and last_name=#{lastName}
Preparing: select * from tbl_employee where id=? and last_name=?
(2)${ }
:取出的值直接拼接在sql语句中 ⇒ 有sql注入安全问题
select * from tbl_employee where id=${id} and last_name=#{lastName}
Preparing: select * from tbl_employee where id=2 and last_name=?
大多是情况下,取参数的值都使用 #{ }
原生JDBC不支持占位符的地方我们就可以使用 ${} 进行取值
例如:
(1)表名不支持占位符,而现在可以使用 ${} 进行拼接
分表(按照年份分表拆分):select * from ${year}_salary where ...; => 2017_salary, 2016_salary...
(2)order by后面的表达式不支持占位符,而现在可以使用 ${} 进行拼接
排序:select * from tnl_employee order by ${f_name} ${order}; ==> 表达式 + desc/aesc
2.#{ }
更丰富的用法 —— 规定参数的一些规则
javaType、 jdbcType、 mode(存储过程)、 numericScale、
resultMap、 typeHandler、 jdbcTypeName、 expression(未来准备支持的功能);
jdbcType通常需要在某种特定的条件下被设置:
在数据为null时,有些数据库不能识别mybatis对null的默认处理(Oracle),此时会报错
JdbcType OTHER:无效的类型;因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型,oracle不能正确处理;
由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持;两种办法
1、#{email,jdbcType=OTHER};
2、jdbcTypeForNull=NULL
<setting name="jdbcTypeForNull" value="NULL"/>