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);
    }

测试成功:

测试失败案例:


 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于MyBatis查询语句耗费时间的问题,有一些方法可以进行排查和优化: 1. 检查SQL语句:确保查询语句的逻辑正确,并且没有不必要的复杂条件或连接。使用数据库的查询优化工具,如EXPLAIN语句,来分析查询计划并找到潜在的性能问题。 2. 索引优化:确保数据库表中的相关列有适当的索引。索引可以加快查询速度,但不当使用或过多索引也可能导致性能下降。使用数据库的索引优化工具,如索引分析器,来检查索引的使用情况和效果。 3. 分页查询优化:如果查询结果需要分页显示,尽量避免使用OFFSET和LIMIT等关键字,因为它们会导致数据库执行额外的操作。可以考虑使用游标或者改变查询策略来优化分页查询。 4. 缓存机制:如果查询结果是经常被重复访问的,考虑使用缓存机制来减少数据库的访问次数。MyBatis提供了一些缓存配置选项,可以根据具体情况进行设置。 5. 数据库连接池:确保数据库连接池的配置合理,并且连接数足够满足并发请求。可以根据实际情况调整连接池的参数,如最大连接数、最小空闲连接数等。 6. 数据库性能监控:使用数据库性能监控工具来实时监测数据库的性能指标,如响应时间、查询次数等。根据监控结果,可以及时发现并解决潜在的性能问题。 希望以上方法能对你有所帮助!如有更多问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值