在实际使用SSM框架进行开发过程中,经常涉及到请求参数的传递,今将项目中常用的几种传值方法进行总结。
总体内容
传递单个参数
传递单个参数的方法比较简单,咱们直接上代码。
本文以根据用户名查询用户为例:
Dao层:
List findByUsername (String username);
mapper.xml:
传递多个参数
以根据用户名和密码查询用户为例:
匿名传参法
Dao层:
User selectByUsernamePwd(String username,String pwd );
mapper.xml:
有两种方式:
或者
上述方法可读性不好,不推荐使用。
@Param传参法
该方法使用@Param注解显示的告诉mybatis参数的名字,然后在xml中就可以使用参数名去引用。
Dao层:
User selectByUsernamePwd(@Param("username") String username,
@Param("pwd") String pwd );
mapper.xml:
Map传参法
使用map来传递多个参数,可以直接使用参数名称进行引用。
在使用该方法进行传递参数的时候,需在controller层将接收到的参数转化成HashMap类型。
Controller层:
@GetMapping("selectByUsernamePwd")
public viod selectByUsernamePwd (String username,String pwd)
{
Map params = new HashMap<>();
params.put("username",username);
params.put("pwd",pwd);
User user = user. selectByUsernamePwd (params);
}
Dao层:
User selectByUsernamePwd(Map params);
mapper.xml:
实体类传参法
使用bean的方式来传递多个参数,使用时parameterType指定为对应的bean类型即可。
这就传参方式的优点是比较方便,controller层使用@RequestBody接收到实体类参数后,直接传递给mapper层调用即可,不需要在进行参数的转换。
controller层:
@PostMapping ("selectByUsernamePwd")
public viod selectByUsernamePwd (@RequestBody User user)
{
User user = user. selectByUsernamePwd (user);
}
Dao层:
User selectByUsernamePwd(User user);
mapper.xml:
JSON传参法
使用该方法,controller层收到JSON型数据后,直接传递给Dao层进行查询操作,简单、方便。
controller层:
@PostMapping ("selectByUsernamePwd")
public viod selectByUsernamePwd (@RequestBody JSONObject user)
{
User user = user. selectByUsernamePwd (user);
}
Dao层:
User selectByUsernamePwd(JSONObject user);
mapper.xml:
集合传参法
在一些复杂的查询中(如 sql中的 in操作),传统的参数传递已无法满足需求,这时候就要用到List、Set、Array类型的参数传递,下面以查询年龄为24,35,47岁的用户为例:
controller层:
@PostMapping ("selectByUserByAges")
public List selectByUserByAges (@RequestBody List ages)
{
List users = user. selectByUserByAges (ages);
return users;
}
Dao层:
List selectByUserByAges(List ages);
mapper.xml:
这里foreach表示循环操作,具体的参数含义如下:
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
集合+对象传参法
该类参数与实体类传参法类似,只不过更复杂一些。下面以班级、学生为例进行说明:
实体类:
@Data
public class Class{
private Long id;
private String className;
List students;
}
controller层:
@PostMapping("selectClass")
public List selectClass (@RequestBody Class class)
{
List result= class.selectClass (class);
return result;
}
Dao层:
List selectClass (@Param("class")Class class);
mapper.xml: