参数处理
-
单个参数:mybatis不会做特殊处理
- #{参数名}:取出参数值
-
多个参数:mybatis会做特殊处理
- 多个参数会被封装成一个map
- key:param1…paramN,或者参数的索引
- value:传入的参数值
- #{}就是从map中获取指定的key的值;
- 多个参数会被封装成一个map
-
命名参数:明确指定封装参数时map的key:@Param(“id”)
- 多个参数会被封装成一个map
- key:使用@Param注解指定值
- value:参数值
- #{指定的key}取出对应的参数值
- 多个参数会被封装成一个map
-
pojo
- 如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo;
- #{属性名}:取出传入的pojo的属性值
-
如果多个参数不是业务模型中的数据,没有对应的pojo,为了方便,我们也可以传入map
- #{key}:取出map中对应的值
-
TO
- 如果多个参数不是业务模型中的数据,但是经常使用,推荐来编写一个TO(Transfer Object)数据传输对象
//TO
Page
{int index;int size;
}
public Employee getEmpByIdAndLastName(Integer id,String lastName);
<select id = "getEmpByIdAndLastName" resultType="com.atguigu.mybatis.bean.Employee">select * from tb1_employee where id = #{id} and last_name = #{lastName}</select>
Employee employee = mapper.getEmpByIdAndLastName(1, "Admin");
报错:
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
正确写法:
<select id = "getEmpByIdAndLastName" resultType="com.atguigu.mybatis.bean.Employee">select * from tb1_employee where id = #{param1} and last_name = #{param2}</select>
命名参数法:
public Employee getEmpByIdAndLastName(@Param("id") Integer id,@Param("lastName") String lastName);
<select id = "getEmpByIdAndLastName" resultType="com.atguigu.mybatis.bean.Employee">select * from tb1_employee where id = #{id} and last_name = #{lastName}</select>
map法:
public Employee getEmpByMap(Map<String ,Object> map);
<!--public Employee getEmpByMap(Map<String,Object> map);--><select id="getEmpByMap" resultType="com.atguigu.mybatis.bean.Employee">select * from tb1_employee where id = #{id} and last_name = #{lastName}</select>
Map<String,Object> map = new HashMap<>();map.put("id",1);map.put("lastName","Tom");Employee employee = mapper.getEmpByMap(map);
扩展思考:
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 getEmp(List<Integer> ids);
取值:
取出第一个id的值:
#{list[0]}