#{参数名}:取出参数值
多个参数:mybatis会做特殊处理
多个参数会被封装成一个map,
key:Param1...ParamN,或者参数的索引也可以
value:传入的参数值
#{}就是从map中获取指定的key值
异常:
Error querying database.
Cause: org.apache.ibatis.binding.BindingException:
Parameter 'id' not found.
Available parameters are [1, 0, param1, param2]
操作:
方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
取值:#{id},#{lastName}
命名参数:明确指定封装参数时map的key;@Param("id")
多个参数会被封装成一个map,
key:使用@param注解指定的值
value:参数值
#{指定的key}取出对应的参数值
POJO:
如果多个参数正好是我们业务逻辑的数据模型,我们直接传入pojo;
#{属性名}:取出传入的pojo的属性值
Map:
如果多个参数不是业务逻辑中的数据模型,不经常使用,为了方便,我们也可以传入map
#{key}:取出map中对应的值
TO:
如果多个参数不是业务逻辑中的数据模型,但是经常使用,推荐来编写一个TO(transfer object)数据传输对象
page{
int index;
int size;
}
=============================思考=============================
public Employee getEmp(@Param("id")Integer id,String lastName);
取值:id:#{id/param1} lastName:#{param2}
public Employee getEmp(Integer id,@Param("e")Employee emp);
取值:id:#{param1} lastName:#{param2.lastName/e.lastName}
###特别注意:如果是collection(List、Set)类型或者是数组,
也会特殊处理。也就是把传入的list或者数组封装在map中。
key:Collection(collection),如果是List还可以使用key(list)
数组(array)
public Employee getEmpById(List<Integer> ids);
取值:取出第一个id的值:#{list[0]}
==========================参数值的获取=============================
#{}:可以获取map中的值或者pojo对象属性的值;
${}:可以获取map中的值或者pojo对象属性的值;
区别:
#{}:是以预编译的方式,将参数设置到sql语句中:preparedStatement;防止sql
${}:取出的值直接拼装在sql语句中;会有安全问题;
大多情况下,我们取参数值都应该去使用#{};
但是,原生jdbc不支持占位符的地方我们就可以使用${}进行取值
比如分表、排序;按照年份分表拆分,在这种情况下若使用#{}取值在编译时会报错;
select * from ${year}_salary where xxx;
select * from tb_empolyee order by ${f_name} ${order}
#{}更丰富的用法
规定参数的一些规则:
JavaType、jdbcType、mode(存储过程)、numericScale、
resultMap、typeHandler、jdbcTypeName、expression(未来准备支持的功能);
jdbcType通常需要在某种特定的条件下被设置;
在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。
比如oracle报错:jdbcType OTHER:无效的列类型;
因为mybatis对所有的null都映射为jdbc OTHER类型,而oracle无法识别OTHER类型,但MySQL可以。
此时可以在后面指定当属性为空时的默认属性:#{email,jdbcType=NULL},
从而当email值为null时,编译时oracle接收到的为NULL而不是mybatis默认的OTHER类型。
由于全局配置中jdbcTypeForNull=OTHER;oracle不支持
处理:
1.#{email,jdbcType=NULL}
2.jdbcTypeForNull=NULL
<setting name="jdbcTypeForNull" value="NULL"/>