<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.UserMapper">
<!--
第一种方式:使用顺序传递参数
XxxController:
@ApiOperation(value = "多个参数查询_匿名顺序传参")
@GetMapping("find1")
public ResultMsg find1(String name,String age)
{
List result= UserMapper.getUserByNameAndAge(gender,age);
return ResultMsg.getMsg(result);
}
XxxMapper.java:
List<User> getUserByNameAndAge(String name, int age);
-->
<select id="getUserByNameAndAge" resultType="com.pojo.User">
select * from user where name=#{param1} and age=#{param2}
</select>
<!--
第二种方式:使用@Param注解,使用@Param注解显示的告诉mybatis参数的名字,这样在xml中就可以按照参数名去引用了
XxxController:
@ApiOperation(value = "多个参数查询_匿名顺序传参")
@GetMapping("find2")
public ResultMsg find2(String name,String age)
{
List result= UserMapper.getUserByNameAndAge2(gender,age);
return ResultMsg.getMsg(result);
}
XxxMapper.java:
List<User> getUserByNameAndAge2(@Param("name") String name, @Param("age") int age);
-->
<select id="getUserByNameAndAge2" resultType="com.pojo.User">
select * from user where name=#{name} and age=#{age}
</select>
<!--
第三种方式:使用Map传递参数,可以看到使用map来传递多个参数,可以直接使用参数的key进行引用。
XxxController:
@ApiOperation(value = "多个参数查询_匿名顺序传参")
@GetMapping("find3")
public ResultMsg find3(String name,String age)
{
Map map = new HashMap<>();
params.put("name",name);
params.put("age",age);
List result= UserMapper.getUserByNameAndAge3(map);
return ResultMsg.getMsg(result);
}
XxxMapper.java:
List<User> getUserByNameAndAge3(Map params);
-->
<select id="getUserByNameAndAge3" resultType="com.pojo.User">
select * from user where name=#{name} and age=#{age}
</select>
<!--
第四种方式:用java bean传递多个参数。
也可以使用bean的方式来传递多个参数,使用时parameterType指定为对应的bean类型即可。
这就传参方式的优点是比较方便,controller层使用@RequestBody接收到实体类参数后,直接传递给mapper层调用即可,不需要在进行参数的转换。
参数的引用直接使用bean的字段。
postMan:
{
"name":"zhangsan",
"age":"23"
}
XxxController:
@ApiOperation(value = "多个参数查询_通过Java Bean传递多个参数")
@PostMapping("find4")
public ResultMsg find4(@RequestBody User user)
{
List result= userMapper.getUserByUser4(user);
return ResultMsg.getMsg(result);
}
XxxMapper.java:
List<User> getUserByUser4(User user);
自测(XxxController.java中):
// 或硬编码:写死实体类
// User user = new User();
// user.setName("222");
// user.setAge(2);
-->
<select id="getUserByNameAndAge4" resultType="com.pojo.User">
select * from user where name=#{name} and age=#{age}
</select>
<!--
第五种方式:直接使用JSON传递参数,这也是推荐的一种传参方式,controller层收到JSON型数据后,直接传递给mapper层进行查询操作,简单 方便
postMan:
{
"name":"zhangsan",
"age":"23"
}
Controller.java
@ApiOperation(value = "多个参数查询_通过JSON传递多个参数")
@PostMapping("find5")
public ResultMsg find5(@RequestBody JSONObject params)
{
List result= userMapper.getUserByNameAndAge5(params);
return ResultMsg.getMsg(result);
}
XxxMapper.java:
List <User> getUserByNameAndAge5(JSONObject params);
自测(XxxController.java中):json
JSONObject object = new JSONObject();
object.put("name","333");
object.put("age","3");
-->
<select id="getUserByNameAndAge5" resultType="com.pojo.User" parameterType="com.alibaba.fastjson.JSONObject">
select * from user where name=#{name} and age=#{age}
</select>
<!--
第六种方式:传递集合类型参数List、Set、Array:在一些复杂的查询中(如 sql中的 in操作),传统的参数传递已无法满足需求,这时候就要用到List、Set、Array类型的参数传递:
这里foreach表示循环操作,具体的参数含义如下:
foreach元素的属性主要有 item,index,collection,open,separator,close。
(1)item表示集合中每一个元素进行迭代时的别名,
(2)index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,
(3)open表示该语句以什么开始,
(4)separator表示在每次进行迭代之间以什么符号作为分隔符,
(5)close表示以什么结束
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
(1)如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
(2)如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
(3)如果传入的参数是多个的时候,我们就需要把它们封装成一个Map或者Object
postMan:
["24","25"]
Controller.java
@ApiOperation(value = "多个参数查询_通过List、Set、Array传递多个参数")
@PostMapping("find6")
public ResultMsg find6(@RequestBody List<String> list)
{
List result= userMapper.findUserList6 (list);
return ResultMsg.getMsg(result);
}
XxxMapper.java:
List <User> findUserList6(List list);
自测(XxxController.java中):List集合
User u1 = new User("Jone");
User u2 = new User("Billie");
List<User> list = new ArrayList();
list.add(u1);
list.add(u2);
-->
<select id="findUserList6" resultType="com.pojo.User">
SELECT * from user where age in
<foreach collection="list" open="(" separator="," close=")" item="user">
#{user.name}
</foreach>
</select>
<!--
第七种方式:参数类型为对象+集合:该类参数与java Bean参数形式类似,只不过更复杂一些,如下面的User类,除了基本字段还包括一个Course的列表bean。
这里foreach 对应User中的List Course。
实体类(表)设计:
@Data
public class User {
private Integer id;
private String name;
private Integer age;
private String email;
private Integer sex;
private List<Course> courseList;
}
@Data
public class Course {
private String coursename;
private String teacher;
private Integer userid;
}
postman:请求
{
"id":"3",
"email":"5290153715@qq.com",
"courseList":[
{
"teacher":"jt"
},
{
"teacher":"ct"
}
]
}
XxxController.java
@ApiOperation(value = "多个参数查询_对象+集合参数")
@PostMapping("find7")
public ResultMsg find7(@RequestBody User user)
{
List result= userMapper.findUserList7(user);
return ResultMsg.getMsg(result);
}
XxxMapper.xml
List <User> findUserList7(@Param("user")User user);
==>附:返回json
==> Preparing: SELECT * from course where userid =? and teacher in ( ? , ? )
==> Parameters: 3(Integer), jt(String), ct(String)
==> Columns: id, coursename, teacher, userid
==> Row: 1, java, jt, 3
==> Row: 2, C, ct, 3
==> Total: 2
{
"data": [
{
"coursename": "北新街ndcpc",
"teacher": "kls0bx19cy"
},
{
"coursename": "北新街lavi0",
"teacher": "gj9q3ygikh"
}
],
"result": "SUCCESS",
"resultCode": 200,
"resultMsg": ""
}
-->
<select id="findUserList7" resultType="com.pojo.User">
SELECT * from course where userid =#{user.id} and teacher in
<foreach collection="user.courseList" open="(" separator="," close=")" item="course">
#{course.teacher}
</foreach>
</select>
</mapper>
参考:
( 这里还有2种 ) MyBatis - 传递参数 7 种方式_放羊的牧码的博客-CSDN博客_mybatis传值方式