MyBtis在实现映射器的时候,通常采用xml文件的形式而非注解的形式,这样的好处是将sql和程序代码解耦,便于统一的管理,因此在java代码中,需要将参数传递到xml文件形式的sql语句。
传递映射器参数一共三种方法,分别是:
- 利用map
- 利用注解@Param
- 利用java bean
下面利用一个例子具体讲解这三种方式,java bean如下。
public class Role{
private Long id;
private String roleName;
private String note;
/** getter and setter*/
}
1,利用map的形式
// Dao层接口
public List<Role> findRoleByMap(Map<String, Object> parameterMap);
// XML文件
<select id="findRoleByMap" parameterType="map" resultType="role">
select id, role_name as roleName, note
from t_role
where role_name like concat('%', #{roleName}, '%')
and note like concat('%', #{note}, '%')
</select>
// 测试代码
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Map<String, Object> parameterMap = new HashMap<String, Object>();
parameterMap.put("roleName", "1");
parameterMap.put("noet", "1");
List<Role> roles = roleMapper.findRoleByMap(parameterMap);
注意,参数roleName和note是map的键,map的值是参数的值。
2,利用@Param
// Dao层接口
public List<Role> findRoleByAnnotation(@Param("roleName") String roleName, @Param("note") String note);
// XML文件
<select id="findRoleByMap" resultType="role">
select id, role_name as roleName, note
from t_role
where role_name like concat('%', #{roleName}, '%')
and note like concat('%', #{note}, '%')
</select>
// 测试代码
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
List<Role> roles = roleMapper.findRoleByAnnotation(roleName, note);
利用@Param的形式来传递参数使用得非常多,利用这种方式,可以不在xml中指定parameterType属性,但是如果参数的数量过多,那么这种方式就不太方便了,利用java bean来传递参数的形式可以解决这个问题。
3,利用java bean
//首先定义一个参数的POJO
public class RoleParams{
private String roleName;
private String note;
}
// Dao层接口
public List<Role> findRoleByBean(RoleParams roleParams);
// XML文件
<select id="findRoleByMap" parameterType="RoleParams类的全限定名" resultType="role">
select id, role_name as roleName, note
from t_role
where role_name like concat('%', #{roleName}, '%')
and note like concat('%', #{note}, '%')
</select>
// 测试代码
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
RoleParams roleParams = new RoleParams();
roleParams.setRoleName("1");
roleParams.setNote("1");
List<Role> roles = roleMapper.findRoleByBean(parameterMap);
4,以上三种方式其实可以混合使用