Mybatis Mapper接口开发 多参数问题

本文探讨了在MyBatis中处理多参数的三种方法:封装成JavaBean、使用Map集合和@Param注解,详细介绍了每种方法的实现步骤,并推荐了@Param注解作为最优实践。

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集合中的键值不同人之间理解有障碍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值