SSM框架中Mybatis传递参数的几种方法

在实际使用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>

扫描下方二维码,关注微信公众号,精彩内容同步更新,有问题可随时交流
微信公众号

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值