1.第一种方式 匿名参数 顺序传递参数
List<Employee> selectByGenderAndAge(Short gender,String age );
<!--会报错BindingException: Parameter 'gender' not found. Available parameters are [arg1, arg0, param1, param2]-->
<select id="selectByGenderAndAge" resultMap="BaseResultMap" >
select * from employee where gender = #{gender} and age = #{age}
</select>
<select id="selectByGenderAndAge" resultMap="BaseResultMap" >
select * from employee where gender = #{param1} and age = #{param2}
</select>
2.第二种方式 使用@Param注解
使用@Param注解显示的告诉mybatis参数的名字,这样在xml中就可以按照参数名去引用了
List<Employee> selectByGenderAndAge( @Param("gender") Short gender,@Param("age") String age );
<select id="selectByGenderAndAge" resultMap="BaseResultMap" >
select * from employee where gender = #{gender} and age = #{age}
</select>
3.使用Map传递参数
//接口定义
List<Employee> selectByMapParams(Map params);
//接口调用
Map params = new HashMap<>();
params.put("gender",gender);
params.put("age",age);
List result= employeeMapper.selectByMapParams(params);
return ResultMsg.getMsg(result);
xml接口定义
<select id="selectByMapParams" resultMap="BaseResultMap" parameterType="map">
select * from employee where gender = #{gender} and age = #{age}
</select>
4.用过java bean传递多个参数
使用bean的方式来传递多个参数,使用时parameterType指定为对应的bean类型即可
List <Employee> selectByBeans(Employee employee);
List result= employeeMapper.selectByBeans(employee);
return ResultMsg.getMsg(result);
xml接口定义
<select id="selectByBeans" resultMap="BaseResultMap" parameterType="com.wg.demo.po.Employee">
select
*
from employee where gender = #{gender} and age = #{age}
</select>
5.直接使用JSON传递参数
一种传参方式,controller层收到JSON型数据后,直接传递给mapper层进行查询操作
@ApiOperation(value = "多个参数查询_通过JSON传递多个参数")
@PostMapping("findByJSONObject")
public ResultMsg findByJSONObject(@RequestBody JSONObject params)
{
List result= employeeMapper.findByJSONObject(params);
return ResultMsg.getMsg(result);
}
List <Employee> findByJSONObject(JSONObject params);
<select id="findByJSONObject" resultMap="BaseResultMap" parameterType="com.alibaba.fastjson.JSONObject">
select
*
from employee where gender = #{gender} and age = #{age}
</select>
6.传递集合类型参数List、Set、Array
在一些复杂的查询中(如 sql中的 in操作),传统的参数传递已无法满足需求,这时候就要用到List、Set、Array类型的参数传递。
foreach元素的属性主要有 item,index,collection,open,separator,close。 item表示集合中每一个元素进行迭代时的别名, index指定一个名字,用于表示在迭代过程中,每次迭代到的位置, open表示该语句以什么开始, separator表示在每次进行迭代之间以什么符号作为分隔符,
close表示以什么结束
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list 2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array 3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map或者Object
@ApiOperation(value = "多个参数查询_通过List、Set、Array传递多个参数")
@PostMapping("findByList")
public ResultMsg findByList(@RequestBody List<String> list)
{
List result= employeeMapper.findByList (list);
return ResultMsg.getMsg(result);
}
List <Employee> findByList(List list);
<select id="findByList" resultMap="BaseResultMap" >
SELECT * from employee where age in
<foreach collection="list" open="(" separator="," close=")" item="age">
#{age}
</foreach>
</select>
7.参数类型为对象+集合
比较复杂的用户法:
接口定义
List <Employee> findByDepartment(@Param("department")Department department);
@Data
public class Department {
private Long id;
private String deptName;
private String descr;
private Date createTime;
List<Employee> employees;
}
@ApiOperation(value = "多个参数查询_对象+集合参数")
@PostMapping("findByDepartment")
public ResultMsg findByDepartment(@RequestBody Department department)
{
List result= employeeMapper.findByDepartment(department);
return ResultMsg.getMsg(result);
}
<select id="findByDepartment" resultMap="BaseResultMap" parameterType="com.wg.demo.po.Department">
SELECT * from employee where dept_id =#{department.id} and age in
<foreach collection="department.employees" open="(" separator="," close=")" item="employee">
#{employee.age}
</foreach>
</select>