单个参数:mybatis不会进行特殊处理#{参数名}:取出参数值
多个参数:mybatis会进行特殊处理。多个参数会封装成一个map
key:param1.param2...paramN,或者参数的索引
value:传入参数值
#{}就是从map中获取指定的key值:
操作:
方法(两个参数均为基本类型):public Employee getEmpByIdAndLastName(Integer id,String name);
方法(一个基本类型和一个对象):public void getIdUserUpdateUser(int id,User user);
异常:
org.apache.ibatis.binding.BindingException:
Parameter 'id' not found.
Available parameters are [1, 0, param1, param2]
解决方法
【命名参数】:明确指定封装参数时map的key;@Param("id")
多个参数会被封装成 一个map,
key:使用@Param注解指定的值
value:参数值
#{指定的key}取出对应的参数值
方法(两个参数均为基本类型):public Employee getEmpByIdAndLastName(@Param("id")Integer id,@Param("name")String name);
取值:id==>#{id/param1} name==>#{name/param2}
方法(一个基本类型和一个对象):public void getIdUserUpdateUser(@Param("id")int id,@Param("user")User user);
user中有{id,name,age,phone}
取值:id==>#{id/param1} user==>#{param2.id,param2.age.../user.id,user.age...}
##特别注意:如果是Collection(List、Set)类型或者是数组,也会特殊处理。也是把传入的list或者数组封装在map中。
key:Collection(collection),如果是List还可以使用这个key(list)数组(array)
public Employee getEmpById(List<Integer> ids);
取值:取出第一个id的值: #{list[0]}
#{}与${}的区别
优先#{},${}会涉及到sql的注入,有风险
具体分析https://blog.csdn.net/lohannes/article/details/79031435
#{}:更丰富的用法:
规定参数的一些规则:
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"/>