我们在前面使用查询语句的时候,只去利用Id值来进行查询,这里只有一个参数,而且我们的select语句里也只允许有一个参数,但是我们当进行更加复杂的查询时,肯定不止一个条件,那么我们的该怎么进行传递参数呢?
多参数问题的处理
第一种解决方法:类似插入等操作传入一个对象
这里使用的代码是之前写的一篇mapper博文里的代码(请点击)
首先在mapper接口和service接口中加入方法:
Emp findEmpByNameAndAge(Emp emp);
在mapper配置文件中加入查询语句:
<select id="findEmpByNameAndAge" parameterType="Emp" resultMap="useResultMap">
select e_id,e_name,e_age,e_birthday,e_salary from emp where e_name = #{name} and e_age = #{age}
</select>
再在service实现类中实现方法:
@Override
public Emp findEmpByNameAndAge(Emp emp) {
SqlSession sqlSession = MybatisUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp2 = mapper.findEmpByNameAndAge(emp);
return emp2;
}
测试中加入测试:
@Test
public void testfindEmpByNameAndAge(){
Emp emp = new Emp(null,"佐助",13,null,null);
EmpService service = new EmpServiceImpl();
Emp emp2 = service.findEmpByNameAndAge(emp);
System.out.println(emp2);
}
测试成功:
测试失败案例:
成功返回对象,失败后返回一个null,可以利用这一点来进行判断数据库中是否存在这一组数据,这个方法可以在登录案例用使用
第二种方法:利用Map将数据进行封装
首先在mapper接口和service接口中加入方法:
Emp findEmpByNameAndAge2(Map map);
在mapper配置文件中加入查询语句:
<select id="findEmpByNameAndAge2" resultMap="useResultMap">
select e_id,e_name,e_age,e_birthday,e_salary from emp where e_name = #{name} and e_age = #{age}
</select>
再在service实现类中实现方法:
@Override
public Emp findEmpByNameAndAge2(Map map) {
SqlSession sqlSession = MybatisUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = mapper.findEmpByNameAndAge2(map);
return emp;
}
测试中加入测试:
@Test
public void testfindEmpByNameAndAge2() {
Map map = new HashMap();
map.put("name","佐助");
map.put("age",13);
EmpService service = new EmpServiceImpl();
Emp emp = service.findEmpByNameAndAge2(map);
System.out.println(emp);
}
测试成功:
测试失败案例:
上面两种方式虽然可以解决问题,但是还是有点不够方便,所以这里提供第三种方法,也是现在十分常用的方法。
第三种方法:使用注解方式
首先在mapper接口中加入方法:
这里就是最核心的一句,这里面是利用@Param注解。
@Param的底层实现原理就是在底层封装了一个Map,然后括号里面传入的值为key值,注解后面的参数中传入的值作为value值
和第二种方法有异曲同工之妙,但是这种方式更加直观,更加方便,也更加容易理解,方法传入的值就是该查询的值,不用再手动封装成对象或者Map,让计算机麻烦,好过自己麻烦,提高开发的效率也是很大的进步,所以这种方式在当前最为流行。
Emp findEmpByNameAndAge3(@Param("name") String name,@Param("age") Integer age);
在service接口中加入方法:
Emp findEmpByNameAndAge3(String name,Integer age);
在mapper配置文件中加入查询语句:
<select id="findEmpByNameAndAge3" resultMap="useResultMap">
select e_id,e_name,e_age,e_birthday,e_salary from emp where e_name = #{name} and e_age = #{age}
</select>
再在service实现类中实现方法:
@Override
public Emp findEmpByNameAndAge3(String name,Integer age) {
SqlSession sqlSession = MybatisUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = mapper.findEmpByNameAndAge3(name,age);
return emp;
}
测试中加入测试:
@Test
public void testfindEmpByNameAndAge3() {
EmpService service = new EmpServiceImpl();
Emp emp = service.findEmpByNameAndAge3("佐助",13);
System.out.println(emp);
}
测试成功:
测试失败案例: