mybatis plus实现条件查询

 更新时间:2022年05月27日 12:44:19   作者:把苹果咬哭的测试笔记  
这篇文章主要为大家介绍了mybatis plus实现条件查询,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、wapper介绍

用mp也可以方便的实现稍复杂点的条件查询,当然了很复杂的就还是要xml编写sql了。

先看下mp的条件构造抽象类的结构:

Wrapper: 条件构造抽象类,最顶端父类

AbstractWrapper: 用于查询条件封装,生成 sql 的 where 条件

QueryWrapper: Entity 对象封装操作类,不是用lambda语法

UpdateWrapper: Update 条件封装,用于Entity对象更新操作

AbstractLambdaWrapper: Lambda 语法使用 Wrapper统一处理解析lambda获取数据库字段

LambdaQueryWrapper: 用于Lambda语法使用的查询Wrapper

LambdaUpdateWrapper: Lambda 更新封装Wrapper

不过最常用的还是QueryWrapper、UpdateWrapper等这些。

套路还是那样,先创建QueryWrapper对象,然后再调用各种方法。

    // 测试条件查询
    @Test
    void testQueryWrapper() {
        //创建对象,泛型里加上实体对象
        QueryWrapper<User> wrapperUser = new QueryWrapper<>();
        // 设置查询的条件
        // ge表示 >= , 这里就是查询age字段,大于40的数据
        wrapperUser.ge("age", 40);
        // 调用查询方法中,传入wrapper对象
        List<User> users = userMapper.selectList(wrapperUser);
        System.out.println(users);
    }

这里就会查询表里age>=40,的数据,看下执行过程的sql语句:

二、常用的条件方法

在构造条件的时候,除了上面的ge,还有很多其他的方法,这里简单介绍下比较常用的,并且贴出执行的sql。

1. gt 表示 >

        ... ...
        // gt表示 > , 这里就是查询age字段,大于40的数据
        wrapperUser.gt("age", 40);
        ... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age > ? 
==> Parameters: 40(Integer)

2. le 表示 <=

        ... ...
        // le表示 <=, 这里就是查询age字段,小于等于40的数据
        wrapperUser.le("age", 40);
        ... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age <= ? 
==> Parameters: 40(Integer)

3. lt 表示 <

        ... ...
        // lt表示 &lt;, 这里就是查询age字段,小于40的数据
        wrapperUser.lt("age", 40);
        ... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age < ? 
==> Parameters: 40(Integer)

4. isNull 表示 查询值为null

        ... ...
        // isNull
        wrapperUser.isNull("name");
        ... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name IS NULL 
==> Parameters: 
<==      Total: 0

5. isNotNull 表示 查询值为不为null

        ... ...
        // isNotNull
        wrapperUser.isNotNull("name");
        ... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name IS NOT NULL 
==> Parameters:

6. eq 表示 =

        ... ...
        // eq
        wrapperUser.eq("name", "大周4");
        ... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name = ? 
==> Parameters: 大周4(String)

7. ne 表示 !=

        ... ...
        // eq
        wrapperUser.ne("name", "大周4");
        ... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name <> ? 
==> Parameters: 大周4(String)

8. between 表示 在范围之间,包含边界值

        ... ...
        // between
        wrapperUser.between("age", 40, 50);
        ... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age BETWEEN ? AND ? 
==> Parameters: 40(Integer), 50(Integer)

9. notBetween 表示 在范围之外,不含边界值

        ... ...
        // between
        wrapperUser.notBetween("age", 40, 50);
        ... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age NOT BETWEEN ? AND ? 
==> Parameters: 40(Integer), 50(Integer)

10. notBetween 表示 在范围之外,不含边界值

        ... ...
        // between
        wrapperUser.notBetween("age", 40, 50);
        ... ...

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age NOT BETWEEN ? AND ? 
==> Parameters: 40(Integer), 50(Integer)

11. allEq 多条件查询

如果我where后面要加多个条件,可以使用allEq。先创建一个hashmap,然后把多个条件put进去,再调用allEq即可。

    @Test
    void testQueryWrapper() {
        QueryWrapper&lt;User&gt; wrapperUser = new QueryWrapper&lt;&gt;();
        Map&lt;String, Object&gt; map = new HashMap&lt;&gt;();
        map.put("id", 5);
        map.put("name", "wesson5");
        map.put("age", 29);
        wrapperUser.allEq(map);
        List&lt;User&gt; users = userMapper.selectList(wrapperUser);
        System.out.println(users);
    }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name = ? AND id = ? AND age = ? 
==> Parameters: wesson5(String), 5(Integer), 29(Integer)

12. .链式编程,多条件查询

此外,还可以使用链式编程,直接在后面继续.调用别的方法。

    @Test
    void testQueryWrapper() {
        //创建对象,泛型里加上实体对象
        QueryWrapper<User> wrapperUser = new QueryWrapper<>();
        wrapperUser.eq("age", 29)
                   .eq("name", "wesson5")
                   .eq("id", 5);
        List<User> users = userMapper.selectList(wrapperUser);
        System.out.println(users);
    }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age = ? AND name = ? AND id = ? 
==> Parameters: 29(Integer), wesson5(String), 5(Integer)

13. or、and

默认情况下,在不调拨or()方法的情况下,是使用and()。

    @Test
    void testQueryWrapper() {
        //创建对象,泛型里加上实体对象
        QueryWrapper<User> wrapperUser = new QueryWrapper<>();
        wrapperUser.eq("age", 29)
                   .or()
                   .eq("name", "wesson5")
                   .or()
                   .eq("id", 5);
        List<User> users = userMapper.selectList(wrapperUser);
        System.out.println(users);
    }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age = ? OR name = ? OR id = ? 
==> Parameters: 29(Integer), wesson5(String), 5(Integer)

14. 嵌套or、嵌套and

查询sql经常会有嵌套or或者and的情况,可以这样写:

    @Test
    void testQueryWrapper() {
        //创建对象,泛型里加上实体对象
        QueryWrapper<User> wrapperUser = new QueryWrapper<>();
        wrapperUser.eq("age", 29)
                   .or(
                           i -> i.eq("name", "wesson5")
                                   .or()
                                   .eq("id", 5)
                   );
        List<User> users = userMapper.selectList(wrapperUser);
        System.out.println(users);
    }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age = ? OR ( name = ? OR id = ? ) 
==> Parameters: 29(Integer), wesson5(String), 5(Integer)

15. in、notIn

等于sql里的 in和not in。

    @Test
    void testQueryWrapper() {
        //创建对象,泛型里加上实体对象
        QueryWrapper&lt;User&gt; wrapperUser = new QueryWrapper&lt;&gt;();
        wrapperUser.in("id", 1, 2, 3); 
        List&lt;User&gt; users = userMapper.selectList(wrapperUser);
        System.out.println(users);
    }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND id IN (?,?,?) 
==> Parameters: 1(Integer), 2(Integer), 3(Integer)

16. inSql、notinSql

inSql、notinSql可以用来子查询,比如 where id in (select * ... ...)

    @Test
    void testQueryWrapper() {
        //创建对象,泛型里加上实体对象
        QueryWrapper<User> wrapperUser = new QueryWrapper<>();
        wrapperUser.in("id", "select id from user where id < 5");
        List<User> users = userMapper.selectList(wrapperUser);
        System.out.println(users);
    }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND id IN (?) 
==> Parameters: select id from user where id < '5'(String)

17. last

last可以直接拼接sql到最后,只能调用一次,多次调用以最后一次为准。
注意:有sql注入的风险,慎用。

    @Test
    void testQueryWrapper() {
        //创建对象,泛型里加上实体对象
        QueryWrapper<User> wrapperUser = new QueryWrapper<>();
        wrapperUser.last("limit 1");
        List<User> users = userMapper.selectList(wrapperUser);
        System.out.println(users);
    }

mp执行的sql:

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 limit 1 
==> Parameters: 

18. 指定要查询的列

只查询出指定的字段,比如"id", "name", "age"。

    @Test
    void testQueryWrapper() {
        //创建对象,泛型里加上实体对象
        QueryWrapper<User> wrapperUser = new QueryWrapper<>();
        wrapperUser.select("id", "name", "age");
        List<User> users = userMapper.selectList(wrapperUser);
        System.out.println(users);
    }

mp执行的sql:

==>  Preparing: SELECT id,name,age FROM user WHERE deleted=0 
==> Parameters: 

以上是一些在业务开发中常用的,稍复杂些的条件查询,实际情况可能还有其他组合变化,更多关于mybatis plus条件查询的资料请关注脚本之家其它相关文章!

相关文章

  • 利用Socket.io 实现消息实时推送功能

    利用Socket.io 实现消息实时推送功能

    这篇文章主要介绍了利用Socket.io 实现消息实时推送功能,需要的朋友可以参考下
    2017-12-12
  • Mapstruct @Mapper @Mapping 使用小结

    Mapstruct @Mapper @Mapping 使用小结

    这篇文章主要介绍了Mapstruct @Mapper @Mapping使用小结,他们用于各个对象实体间的相互转换,例如数据库底层实体转为页面对象,Model 转为 DTO, DTO 转为其他中间对象, VO 等等,相关转换代码为编译时自动产生的新文件和代码,需要的朋友可以参考下
    2023-09-09
  • 基于Elasticsearch5.4的常见问题总结

    基于Elasticsearch5.4的常见问题总结

    下面小编就为大家分享一篇基于Elasticsearch5.4的常见问题总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Java多线程之同步工具类CountDownLatch

    Java多线程之同步工具类CountDownLatch

    这篇文章主要介绍了Java多线程之同步工具类CountDownLatch,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有框架服务之后执行,下面一起来学习学习内容吧
    2021-10-10
  • java使用MulticastSocket实现基于广播的多人聊天室

    java使用MulticastSocket实现基于广播的多人聊天室

    这篇文章主要为大家详细介绍了java使用MulticastSocket实现基于广播的多人聊天室,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • java编译器的基础知识点

    java编译器的基础知识点

    在本篇文章里小编给大家整理的是一篇关于java编译器的基础知识点内容,有兴趣的朋友们可以阅读下。
    2020-02-02
  • 详解Spring整合Ehcache管理缓存

    详解Spring整合Ehcache管理缓存

    本文先通过Ehcache应用的范例来介绍它的基本使用方法,然后再介绍与Spring整合的方法,
    2017-03-03
  • Java中synchronized的四种用法详解

    Java中synchronized的四种用法详解

    这篇文章主要介绍了Java中synchronized的四种用法详解,当我们处理多线程处理同步问题的时候就会用到synchronized这个关键字,下面介绍下synchronized的四种用法,需要的朋友可以参考下
    2024-01-01
  • Springboot+Vue+axios实现文章收藏功能

    Springboot+Vue+axios实现文章收藏功能

    这篇文章主要为大家详细介绍了Springboot+Vue+axios实现文章收藏功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • java 中断线程的几种方式 interrupt()详解

    java 中断线程的几种方式 interrupt()详解

    中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。这篇文章主要介绍了java 中断线程的几种方式 interrupt(),需要的朋友可以参考下
    2021-11-11

最新评论