1.MyBatis对参数的处理
1.1 单个参数:mybatis不会做特殊处理
#{参数名/任意名}:取出参数值。
1.2 多个参数:mybatis会做特殊处理
封装成 一个map,
key:param1...paramN,或者参数的索引也可以
value:传入的参数值
#{}就是从map中获取指定的key的值;
1.3 参数类型:Collection(List、Set)类型或者是数组
封装在map中。
key:Collection(collection)| List(list)| 数组(array)
value:传入的参数值
public Employee getEmpById(List<Integer> ids);
取值:取出第一个id的值: #{list[0]}
2.命名参数:指定封装参数时map的key @Param(“id”)
多个参数会被封装成 一个map,
key:使用@Param注解指定的值
value:参数值
#{指定的key}取出对应的参数值
public Employee getEmployeeID2(@Param("id") Integer id,@Param("name") String name);
3.传入参数类型的选择
3.1 POJO(简单的JAVA类,一般为bean包下的对象)
如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo
#{属性名}:取出传入的pojo的属性值
接口方法(后面部分省略)
public boolean insertEmployee(Employee employee);
3.2 Map
如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,我们也可以传入map
#{key}:取出map中对应的值
接口方法
public Employee getEmployeeID3(Map<String,Object> map);
Mapper.xml的select
<select id="getEmployeeID3" resultType="bean.Employee" databaseId="mysql">
select * from employee where id = #{id} AND name=#{name}
</select>
test中的使用
Map<String,Object> map = new HashMap<>();
map.put("id",1);
map.put("name","litao");
Employee employee = employeeMapper.getEmployeeID3(map);
System.out.println(employee);
3.3 TO
如果多个参数不是业务模型中的数据,但是经常要使用,推荐来编写一个TO(Transfer Object)数据传输对象
4.参数值的获取
4.1 #{}与${}区别
select * from employee where id=${id} and name=#{name}
Preparing: select * from employee where id=1 and name=?
#{}:(大多数使用)是以预编译的形式,将参数设置到sql语句中;同PreparedStatement可以防止sql注入
${}:(特别需求时使用)取出的值直接拼装在sql语句中;会有安全问题;
4.2 使用${}
原生jdbc不支持占位符的地方我们就可以使用${}进行取值
比如分表、排序。。。;按照年份分表拆分 select * from ${year}_salary where xxx;
4.3 #{}其他的用法
jdbcType通常需要在某种特定的条件下被设置:
在我们数据为null的时候,Oracle数据库不能识别mybatis对null的默认处理。
由于mybatis对所有的null都映射的是原生Jdbc的OTHER类型,oracle不能正确处理;
两种解决办法:
1、(#{}中)#{email,jdbcType=NULL}
2、(全局配置中)<setting name="jdbcTypeForNull" value="NULL"/>
5.内置参数
5.1 _parameter:代表整个参数
单个参数:_parameter就是这个参数
多个参数:参数会被封装为一个map,_parameter就是代表这个map
5.2 _databaseId:如果配置了databaseIdProvider标签,
_databaseId就是代表当前数据库的别名oracle