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