【mybatis-plus】条件查询

简介: 【mybatis-plus】条件查询

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


一、wapper介绍


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


1268169-20201229000712706-317772424.png


  • Wrapper: 条件构造抽象类,最顶端父类
  • AbstractWrapper: 用于查询条件封装,生成 sql 的 where 条件
  • QueryWrapper: Entity 对象封装操作类,不是用lambda语法
  • UpdateWrapper: Update 条件封装,用于Entity对象更新操作
  • AbstractLambdaWrapper: Lambda 语法使用 Wrapper统一处理解析lambda获取数据库字段
  • LambdaQueryWrapper: 用于Lambda语法使用的查询Wrapper
  • LambdaUpdateWrapper: Lambda 更新封装Wrapper


不过最常用的还是QueryWrapperUpdateWrapper等这些。


套路还是那样,先创建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语句:


1268169-20201229002503276-1033712549.png


二、常用的条件方法


在构造条件的时候,除了上面的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表示 <, 这里就是查询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<User> wrapperUser = new QueryWrapper<>();
        Map<String, Object> map = new HashMap<>();
        map.put("id", 5);
        map.put("name", "wesson5");
        map.put("age", 29);
        wrapperUser.allEq(map);
        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 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<User> wrapperUser = new QueryWrapper<>();
        wrapperUser.in("id", 1, 2, 3); 
        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: 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:


以上是一些在业务开发中常用的,稍复杂些的条件查询,实际情况可能还有其他组合变化。

相关文章
|
6月前
|
XML Java 数据库连接
mybatis中在xml文件中通用查询结果列如何使用
mybatis中在xml文件中通用查询结果列如何使用
414 0
|
2月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
187 8
|
23天前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
14 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
29天前
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
34 1
|
2月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
6月前
|
SQL
MyBatis-Plus-Join关联查询
MyBatis-Plus-Join关联查询
296 2
|
6月前
|
SQL Java 关系型数据库
Mybatis多表关联查询与动态SQL(下)
Mybatis多表关联查询与动态SQL
133 0
|
6月前
|
SQL Java 数据库连接
Mybatis多表关联查询与动态SQL(上)
Mybatis多表关联查询与动态SQL
201 0
|
6月前
|
SQL 缓存 Java
mybatis 一对多查询
mybatis 一对多查询
121 0
|
6月前
|
SQL XML Java
MyBatis-Plus多表关联查询
MyBatis-Plus多表关联查询
627 0