在实际使用SSM框架进行开发过程中,经常涉及到请求参数的传递,今将项目中常用的几种传值方法进行总结。
总体内容
传递单个参数
传递单个参数的方法比较简单,咱们直接上代码。
本文以根据用户名查询用户为例:
Dao层:
List<User> findByUsername (String username);
mapper.xml:
<select id="findByUsername" resultType="User" parameterType="String">
select * from user where username = #{username}
</select>
传递多个参数
以根据用户名和密码查询用户为例:
匿名传参法
Dao层:
User selectByUsernamePwd(String username,String pwd );
mapper.xml:
有两种方式:
<select id=" selectByUsernamePwd " resultMap="BaseResultMap" >
select * from user where user_name = #{0} and pwd = #{1}
</select>
或者
<select id=" selectByUsernamePwd " resultMap="BaseResultMap" >
select * from user where user_name = #{param1} and pwd = #{param2}
</select>
上述方法可读性不好,不推荐使用。
@Param传参法
该方法使用@Param注解显示的告诉mybatis参数的名字,然后在xml中就可以使用参数名去引用。
Dao层:
User selectByUsernamePwd(@Param("username") String username,
@Param("pwd") String pwd );
mapper.xml:
<select id=" selectByUsernamePwd " resultMap="BaseResultMap" >
select * from user where user_name = #{username} and pwd = #{pwd}
</select>
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:
<select id=" selectByUsernamePwd " resultMap="BaseResultMap" parameterType="map">
select * from user where user_name = #{username} and pwd = #{pwd}
</select>
实体类传参法
使用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:
<select id=" selectByUsernamePwd " resultMap="BaseResultMap"
parameterType="com.demo.User">
select * from user where user_name = #{username} and pwd = #{pwd}
</select>
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:
<select id=" selectByUsernamePwd " resultMap="BaseResultMap"
parameterType="com.alibaba.fastjson.JSONObject">
select * from user where user_name = #{username} and pwd = #{pwd}
</select>
集合传参法
在一些复杂的查询中(如 sql中的 in操作),传统的参数传递已无法满足需求,这时候就要用到List、Set、Array类型的参数传递,下面以查询年龄为24,35,47岁的用户为例:
controller层:
@PostMapping ("selectByUserByAges")
public List<User> selectByUserByAges (@RequestBody List<Short> ages)
{
List<User> users = user. selectByUserByAges (ages);
return users;
}
Dao层:
List<User> selectByUserByAges(List<Short> ages);
mapper.xml:
<select id="selectByUserByAges" resultMap="BaseResultMap">
SELECT * from user where age in
<foreach collection="list" open="(" separator="," close=")" item="age">
#{age}
</foreach>
</select>
这里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<Student> students;
}
controller层:
@PostMapping("selectClass")
public List<Class> selectClass (@RequestBody Class class)
{
List<Class> result= class.selectClass (class);
return result;
}
Dao层:
List <Class> selectClass (@Param("class")Class class);
mapper.xml:
<select id="selectClass" resultMap="BaseResultMap" parameterType="com.demo.Class">
SELECT * from class where id =#{id} and age in
<foreach collection="class.students" open="(" separator="," close=")"
item="student">
#{student.age}
</foreach>
</select>