Mybatis Mapper接口开发 多参数问题
简述
在使用Mapper接口开发的时候,因为Mapper接口中的方法参数只能有一个,当我们需要传多个值时候会遇到问题,该怎么办?
-
有三种解决办法
-
第一种:封装成JavaBean
第二种:封装到Map
第三种:使用@Param注解
封装成JavaBean
例子:员工类里有多个属性,想要传递多个属性值
public class Employee {
//属性名
private String name ;
private String password ;
//属性的get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
需要封装到一个类中,例如封装到EmployeeBO类中
public class EmployeeBO {
private Employee employee ;
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
}
在Service层把EmployeeBO当做参数传递
public class EmployeeServiceImpl implements EmployeeService {
public Employee login(String name, String password) throws Exception {
//Mybatis主配置文件名
//加载主配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//建立连接
SqlSession sqlSession = sqlSessionFactory.openSession();
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
//封装Employee对象
Employee employee = new Employee();
employee.setName(name);
employee.setPassword(password);
//创建值对象 将封装好的Employee传入值对象
EmployeeBO employeeBO = new EmployeeBO();
employeeBO.setEmployee(employee);
//调用Mapper接口中的方法并返回返回值
return employeeMapper.login(employeeBO);
}
}
Mapper接口中参数为值对象
public interface EmployeeMapper {
public Employee login(EmployeeBO employeeBO) throws Exception ;
}
在映射文件中
<mapper namespace="需要填写Mapper接口的全限定名">
<select id="login" resultType="Employee的全限定名" parameterType="EmployeeBO类的全限定名">
SELECT name,
password
FROM employee
WHERE name = #{employee.name} AND password = #{employee.password}
</select>
</mapper>
封装到Map
在Service层需要把参数放在一个Map集合中,然后传递Map集合
public Employee login2(String name , String password) throws Exception
{
//Mybatis主配置文件名
//加载主配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//建立连接
SqlSession sqlSession = sqlSessionFactory.openSession();
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
//创建一个Map集合,把属性放在Map集合中
Map<String,String> map = new HashMap<String,String>();
map.put("name",name);
map.put("password" , password);
return employeeMapper.login2(map);
}
Mapper接口中参数为Map集合
public interface EmployeeMapper {
public Employee login2(Map map) throws Exception ;
}
在映射文件中
<mapper namespace="需要填写Mapper接口的全限定名">
<select id="login2" resultType="Employee的全限定名">
SELECT name,
password
FROM t_employee
WHERE name = #{name} AND password = #{password}
</select>
</mapper>
使用@Param注解
在Service层直接传递多个参数
public class EmployeeServiceImpl implements EmployeeService {
public Employee login(String name, String password) throws Exception {
//Mybatis主配置文件名
//加载主配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//建立连接
SqlSession sqlSession = sqlSessionFactory.openSession();
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
return employeeMapper.login3(name , age);
}
}
Mapper接口中使用注解方式传递参数
public interface EmployeeMapper {
public Employee login3(@Param("name") String name, @Param("password") String password) throws Exception ;
}
在映射文件中
<mapper namespace="需要填写Mapper接口的全限定名">
<select id="login3" resultType="Employee的全限定名">
SELECT name,
password
FROM employee
WHERE name = #{name} AND age = ${password}
</select>
</mapper>
总结
三种方法中@Param注解方式是最提倡的,第一种太繁琐,第二种使用的人很多,但是Map集合中的键值不同人之间理解有障碍
本文探讨了在MyBatis中处理多参数的三种方法:封装成JavaBean、使用Map集合和@Param注解,详细介绍了每种方法的实现步骤,并推荐了@Param注解作为最优实践。
7185

被折叠的 条评论
为什么被折叠?



