Mybatis查询语句多参数问题的处理

我们在前面使用查询语句的时候,只去利用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);
    }

测试成功:

测试失败案例:


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值