1、单个参数
mybatis不做特殊处理。#{参数名}即可取出值,参数名随意取
2、多个参数
mybatis会将其封装成map,
key:param1,param2,。。。paramN,或参数的索引
value:传入的参数值
#{}就是从map中获取制定的key值。
例如:
接口为:public Employee getEmpByIdAndLastName(Integer id, String lastName);
sql:select id,last_name lastName,email,gender where id=#{id} and last_name=#{lastName}
此时会报错:Parameter 'id' not found. Available parameters are [0, 1, param1, param2]
此时需要改写成
select id,last_name lastName,email,gender from tbl_employee where id=#{param1} and last_name=#{param2}
或
select id,last_name lastName,email,gender from tbl_employee where id=#{0} and last_name=#{1}
这样虽然可以实现,但是对于程序的阅读性不好。
1、参数命名法:使用@Param注解
明确key为@Param注解指定的值,value为参数值。
例如
public Employee getEmpByIdAndLastName(@Param("id")Integer id, @Param("lastName")String lastName);
此时就可以写成如下语句了
select id,last_name lastName,email,gender from tbl_employee where id=#{id} and last_name=#{lastName}
Employee employee = employeeMapper.getEmpByIdAndLastName(1, "tom");
System.out.println(employee);
2、POJO:传入一个对象(业务中的模型数据bean)
#{属性名},取出pojo的属性值。
接口:public Employee getEmpByEmp(Employee employee);
此时就可以写成如下语句了
select id,last_name lastName,email,gender from tbl_employee where id=#{id} and last_name=#{lastName}
Employee employeeParam = new Employee();
employeeParam.setId(2);
employeeParam.setLastName("jerry");
Employee empByEmp = employeeMapper.getEmpByEmp(employeeParam);
System.out.println(empByEmp);
3、Map:传入一个map参数(无已有bean可用)
#{key}取出map中对应的值。
接口:public Employee getEmpByMap(Map<String, Object> paraMap);
此时就可以写成如下语句了
select id,last_name lastName,email,gender from tbl_employee where id=#{id} and last_name=#{lastName}
Map<String, Object> paraMap = new HashMap<String, Object>();
paraMap.put("id", 3);
paraMap.put("lastName", "limei");
Employee empByMap = employeeMapper.getEmpByMap(paraMap);
System.out.println(empByMap);
注:如果经常使用,可以编写一个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]}