mybatis 传递多个参数

mybatis传递多个参数

在我们以前的例子中都是传递了一个参数,接下来将介绍传递多个参数的3种方式。

map接口传递参数

在mybatis中允许map接口通过键对值传递多个参数。
首先我们先编写映射器接口:

public List<Role> findRolesByMap(Map<String,Object> paramMap);

设置参数为map类型,然后编写映射文件

    <select id="findRolesByMap" parameterType="map" resultType="role">
        SELECT 
          id,
          roleName,
          note 
        FROM
          role 
        WHERE 
            roleName 
        LIKE 
        CONCAT('%',#{roleName},'%') 
        AND
            note 
        LIKE 
        CONCAT('%',#{note},'%') 
    </select>

让parameterType设置为map,接下来进行测试

sqlSession = SqlSessionFactoryUtils.openSession();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            Map<String,Object> paramMap = new HashMap<String,Object>();
            paramMap.put("roleName", 1);
            paramMap.put("note", 1);
            List<Role> role = roleMapper.findRolesByMap(paramMap);

通过打印的日志,我们发现key值对应的就是我们的参数#{roleName}和#{note}。

使用注解传递多个参数

使用map传递参数的缺点就是可读性不好,为此,mybatis提供了注解方式。@Param 通过它可以去定义映射器的参数名称。通常把接口方法定义为

public List<Role> findRolesByMap(@Param("roleName")String roleName , @Param("note")String note);

更改测试代码

sqlSession = SqlSessionFactoryUtils.openSession();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            List<Role> role = roleMapper.findRolesByMap("1","1");

即使不更改parameterType,让mybatis自己配置就好,涉及到底层知识。
但是当参数有很多时候,还有java bean方式供我们选择。

java bean 方式

首先定义一个参数的POJO

public class RoleParams {

    private String roleName;
    private String note;
    public String getRoleName() {
        return roleName;
    }
    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }
    public String getNote() {
        return note;
    }
    public void setNote(String note) {
        this.note = note;
    }

}

然后修改我们接口的方法

    public List<Role> findRolesByMap(RoleParams param);

最后用测试代码测试,得出结果。

sqlSession = SqlSessionFactoryUtils.openSession();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            RoleParams param = new RoleParams();
            param.setNote("1");
            param.setRoleName("1");
            List<Role> role = roleMapper.findRolesByMap(param);

混合使用

在某些情况下,我们需要两个pojo的属性作为参数,这也是可行的,并且是合理的。首先需要设置接口方法的参数

public List<Role> findRolesByMap(@Param("param1")RoleParam1 param1,@Param("param2")RoleParam2 param2);

这两个pojo就是将上一个例子中两个属性拆分。
然后更改我们的映射文件

<select id="findRolesByMap" parameterType="map" resultType="role">
        SELECT 
          id,
          roleName,
          note 
        FROM
          role 
        WHERE 
            roleName 
        LIKE 
        CONCAT('%',#{param2.roleName},'%') 
        AND
            note 
        LIKE 
        CONCAT('%',#{param1.note},'%') 
    </select>

注意sql中的参数选择方式。请自己编写测试代码进行测试。

总结

  • 使用map传递参数导致了业务可读性的丧失,增加后期维护的难度。
  • 采用注解方式传递参数,受到参数个数影响,当参数个数较少时它是不错的选择
  • 当参数个数较多时,java bean是个不错的选择。
  • 对于混合使用要明确参数的合理性,在sql中注意是哪个对象的哪个参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值