mybatis 传递多个参数

来源:互联网 发布:虫虫钢琴软件 编辑:程序博客网 时间:2024/06/05 23:06

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中注意是哪个对象的哪个参数。