Mybatis plus:Wrapper接口

一、介绍

        MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。

  • Wrapper : 条件构造抽象类,最顶端父类
  • AbstractWrapper : 这是一个抽象基类,提供了所有 Wrapper 类共有的方法和属性。它定义了条件构造的基本逻辑,包括字段(column)、值(value)、操作符(condition)等。所有的 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都继承自 AbstractWrapper。
  • QueryWrapper : 专门用于构造查询条件,支持基本的等于、不等于、大于、小于等各种常见操作。它允许你以链式调用的方式添加多个查询条件,并且可以组合使用 and 和 or 逻辑。
  • UpdateWrapper : 用于构造更新条件,可以在更新数据时指定条件。与 QueryWrapper 类似,它也支持链式调用和逻辑组合。使用 UpdateWrapper 可以在不创建实体对象的情况下,直接设置更新字段和条件。
  • AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
  • LambdaQueryWrapper :这是一个基于 Lambda 表达式的查询条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。这种方式提高了代码的可读性和可维护性,尤其是在字段名可能发生变化的情况下。
  • LambdaUpdateWrapper : 类似于 LambdaQueryWrapper,LambdaUpdateWrapper 是基于 Lambda 表达式的更新条件构造器。它允许你使用 Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题。

二、Wrapper使用

1、allEq() 多个字段相等

        allEq方法是 MyBatis-Plus 中用于构建查询条件的方法之一,它允许我们通过一个 Map 来设置多个字段的相等条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.allEq(Map.of("id", 1, "name", "老王", "age", null));
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        Map<SFunction<User,?>, Object> map = new HashMap<>();
        map.put(User::getId,1);
        map.put(User::getName,"老王");
        map.put(User::getAge,null);
        lambdaQueryWrapper.allEq(map);

        //生成的sql: SELECT * FROM user WHERE id = 1 AND name = '老王' AND age IS NULL
    }

2、eq() 相等

   eq 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的相等条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", "老王");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getName, "老王");

        //生成的sql: SELECT * FROM user WHERE name = '老王'
    }

3、ne() 不相等

   ne 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的不相等条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.ne("name", "老王");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.ne(User::getName, "老王");

        //生成的sql: SELECT * FROM user WHERE name <> '老王'
    }

4、gt() 大于

  gt 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的大于条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.gt("age", 18);
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.gt(User::getAge, 18);

        //生成的sql: SELECT * FROM user WHERE age > 18
    }

5、ge() 大于等于

   ge 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的大于等于条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.ge("age", 18);
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.ge(User::getAge, 18);

        //生成的sql: SELECT * FROM user WHERE age >= 18
    }

6、lt() 小于

   lt 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的小于条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.lt("age", 18);
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.lt(User::getAge, 18);

        //生成的sql: SELECT * FROM user WHERE age < 18
    }

7、le() 小于等于

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.le("age", 18);
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.le(User::getAge, 18);

        //生成的sql: SELECT * FROM user WHERE age <= 18
    }

8、between

   between 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的 BETWEEN 条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.between("age", 18, 30);
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.between(User::getAge, 18, 30);

        //生成的sql: SELECT * FROM user WHERE age BETWEEN 18 AND 30
    }

9、notBetween

   notBetween 方法是 MyBatis-Plus 中用于构建查询条件的另一个基本方法,它用于设置单个字段的 NOT BETWEEN 条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.notBetween("age", 18, 30);
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.notBetween(User::getAge, 18, 30);

        //生成的sql: SELECT * FROM user WHERE age NOT BETWEEN 18 AND 30
    }

10、like %val%

   like 方法是 MyBatis-Plus 中用于构建模糊查询条件的基本方法之一,它用于设置单个字段的 LIKE 条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("name", "王");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.like(User::getName, "王");

        //生成的sql: SELECT * FROM user WHERE name LIKE '%王%'
    }

11、not like %val%

   notLike 方法是 MyBatis-Plus 中用于构建模糊查询条件的另一个基本方法,它用于设置单个字段的 NOT LIKE 条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.notLike("name", "王");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.notLike(User::getName, "王");

        //生成的sql: SELECT * FROM user WHERE name NOT LIKE '%王%'
    }

12、likeLeft %val

   likeLeft 方法是 MyBatis-Plus 中用于构建模糊查询条件的基本方法之一,它用于设置单个字段的左模糊匹配条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.likeLeft("name", "王");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.likeLeft(User::getName, "王");

        //生成的sql: SELECT * FROM user WHERE name LIKE '%王'
    }

13、likeRight val%

   likeRight 方法是 MyBatis-Plus 中用于构建模糊查询条件的基本方法之一,它用于设置单个字段的右模糊匹配条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.likeRight("name", "王");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.likeRight(User::getName, "王");

        //生成的sql: SELECT * FROM user WHERE name LIKE '王%'
    }

14、notLikeLeft

   notLikeLeft 方法是 MyBatis-Plus 中用于构建模糊查询条件的另一个基本方法,它用于设置单个字段的非左模糊匹配条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.notLikeLeft("name", "王");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.notLikeLeft(User::getName, "王");

        //生成的sql: SELECT * FROM user WHERE name NOT LIKE '%王'
    }

15、notLikeRight

   notLikeRight 方法是 MyBatis-Plus 中用于构建模糊查询条件的另一个基本方法,它用于设置单个字段的非右模糊匹配条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.notLikeRight("name", "王");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.notLikeRight(User::getName, "王");

        //生成的sql: SELECT * FROM user WHERE name NOT LIKE '王%'
    }

16、isNull

   isNull 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的 IS NULL 条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.isNull("name");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.isNull(User::getName);

        //生成的sql: SELECT * FROM user WHERE name IS NULL
    }

17、in

   in 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的 IN 条件,即字段的值在给定的集合中。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("age", Arrays.asList(1, 2, 3));
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.in(User::getAge, Arrays.asList(1, 2, 3));

        //生成的sql: SELECT * FROM user WHERE age IN (1, 2, 3)
    }

18、notIn

   notIn 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的 NOT IN 条件,即字段的值不在给定的集合中。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.notIn("age", Arrays.asList(1, 2, 3));
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.notIn(User::getAge, Arrays.asList(1, 2, 3));

        //生成的sql: SELECT * FROM user WHERE age NOT IN (1, 2, 3)
    }

19、inSql

   inSql 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置单个字段的 IN 条件,但与 in 方法不同的是,inSql 允许你直接使用 SQL 语句来生成 IN 子句中的值集合。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.inSql("age", "1,2,3,4,5,6");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.inSql(User::getAge, "1,2,3,4,5,6");

        //生成的sql: SELECT * FROM user WHERE age IN (1, 2, 3, 4, 5, 6)

        // 使用子查询的示例:
        queryWrapper.inSql("id", "select id from other_table where id < 3");

        //生成的sql: SELECT * FROM user WHERE id IN (select id from other_table where id < 3)
    }

20、notInSql

   notInSql 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置单个字段的 NOT IN 条件,但与 notIn 方法不同的是,notInSql 允许你直接使用 SQL 语句来生成 NOT IN 子句中的值集合。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.notInSql("age", "1,2,3,4,5,6");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.notInSql(User::getAge, "1,2,3,4,5,6");

        //生成的sql: SELECT * FROM user WHERE age NOT IN (1, 2, 3, 4, 5, 6)

        // 使用子查询的示例:
        queryWrapper.notInSql("id", "select id from other_table where id < 3");

        //生成的sql: SELECT * FROM user WHERE id NOT IN (select id from other_table where id < 3)
    }

21、eqSql gtSql geSql ltSql leSql 要求版本3.4.3.2以后

        以上都是MyBatis-Plus 中用于构建查询条件的高级方法之一,可以使用子查询。

22、groupBy

   groupBy 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置查询结果的分组条件。通过指定一个或多个字段,groupBy 方法可以生成 SQL 语句中的 GROUP BY 子句。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.groupBy("id", "name");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.groupBy(User::getId, User::getName);

        //生成的sql: SELECT * FROM user GROUP BY id, name
    }

23、orderByAsc

   orderByAsc 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置查询结果的升序排序条件。通过指定一个或多个字段,orderByAsc 方法可以生成 SQL 语句中的 ORDER BY 子句,并指定升序排序。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByAsc("id", "name");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.orderByAsc(User::getId, User::getName);

        //生成的sql: SELECT * FROM user ORDER BY id ASC, name ASC
    }

24、orderByDesc

   orderByDesc 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置查询结果的降序排序条件。通过指定一个或多个字段,orderByDesc 方法可以生成 SQL 语句中的 ORDER BY 子句,并指定降序排序。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("id", "name");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.orderByDesc(User::getId, User::getName);

        //生成的sql: SELECT * FROM user ORDER BY id DESC, name DESC
    }

25、orderBy

   orderBy 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置查询结果的排序条件。通过指定一个或多个字段以及排序方向(升序或降序),orderBy 方法可以生成 SQL 语句中的 ORDER BY 子句。true表示ASC,false表示DESC。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderBy(true, true, "id", "name");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.orderBy(true, true, User::getId, User::getName);

        //生成的sql: SELECT * FROM user ORDER BY id ASC, name ASC
    }

26、having

   having 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置 HAVING 子句,通常与 GROUP BY 一起使用,用于对分组后的数据进行条件筛选。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.groupBy("age").having("sum(age) > 10");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.groupBy(User::getAge).having("sum(age) > {0}", 10);

        //生成的sql: SELECT * FROM user GROUP BY age HAVING sum(age) > 10
    }

27、func

   func 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它提供了一种在链式调用中根据条件执行不同查询操作的机制。通过传入一个 Consumer 函数式接口,func 方法允许你在不中断链式调用的情况下,根据条件执行不同的查询构建逻辑。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.func(i -> {
            if (true) {
                i.eq("id", 1);
            } else {
                i.ne("id", 1);
            }
        });
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.func(i -> {
            if (true) {
                i.eq(User::getId, 1);
            } else {
                i.ne(User::getId, 1);
            }
        });

        // 如果条件为 true,则生成的 SQL 为: SELECT * FROM user WHERE id = 1
        // 如果条件为 false,则生成的 SQL 为:SELECT * FROM user WHERE id != 1
    }

28、or

   or 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于在查询条件中添加 OR 逻辑。通过调用 or 方法,可以改变后续查询条件的连接方式,从默认的 AND 连接变为 OR 连接。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id", 1).or().eq("name", "老王");
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getId, 1).or().eq(User::getName, "老王");

        // 生成的 SQL:SELECT * FROM user WHERE id = 1 OR name = '老王'

        // OR 嵌套示例:
        queryWrapper.or(i -> i.and(j -> j.eq("name", "李白").eq("status", "alive"))
                .and(j -> j.eq("name", "杜甫").eq("status", "alive")));

        lambdaQueryWrapper.or(i -> i.and(j -> j.eq(User::getName, "李白").eq(User::getStatus, "alive"))
                .and(j -> j.eq(User::getName, "杜甫").eq(User::getStatus, "alive")));

        // 生成的 SQL:SELECT * FROM user WHERE (name = '李白' AND status = 'alive') OR (name = '杜甫' AND status = 'alive')
    }

29、and

   and 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于在查询条件中添加 AND 逻辑。通过调用 and 方法,可以创建 AND 嵌套条件,即在一个 AND 逻辑块中包含多个查询条件。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.and(i -> i.and(j -> j.eq("name", "李白").eq("status", "alive"))
                .and(j -> j.eq("name", "杜甫").eq("status", "alive")));
        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.and(i -> i.and(j -> j.eq(User::getName, "李白").eq(User::getStatus, "alive"))
                .and(j -> j.eq(User::getName, "杜甫").eq(User::getStatus, "alive")));

        // 生成的 SQL:SELECT * FROM user WHERE ((name = '李白' AND status = 'alive') AND (name = '杜甫' AND status = 'alive'))
    }

30、nested

   nested 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于创建一个独立的查询条件块,不带默认的 AND 或 OR 逻辑。通过调用 nested 方法,可以在查询条件中添加一个嵌套的子句,该子句可以包含多个查询条件,并且可以被外部查询条件通过 AND 或 OR 连接。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.nested(i -> i.eq("name", "李白").ne("status", "活着"));

        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.nested(i -> i.eq(User::getName, "李白").ne(User::getStatus, "活着"));


        // 生成的 SQL:SELECT * FROM user WHERE (name = '李白' AND status <> '活着')
    }

31、apply

   apply 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它允许你直接拼接 SQL 片段到查询条件中。这个方法特别适用于需要使用数据库函数或其他复杂 SQL 构造的场景。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.apply("id = 1");
        // 生成的 SQL:SELECT * FROM user WHERE id = 1

        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.apply("date_format(dateColumn, '%Y-%m-%d') = '2008-08-08'");

        // 使用参数占位符的示例:
        queryWrapper.apply("date_format(dateColumn, '%Y-%m-%d') = {0}", "2008-08-08");

        // 生成的 SQL:SELECT * FROM user WHERE date_format(dateColumn, '%Y-%m-%d') = '2008-08-08'
    }

32、last

   last 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它允许你直接在查询的最后添加一个 SQL 片段,而不受 MyBatis-Plus 的查询优化规则影响。这个方法应该谨慎使用,因为它可能会绕过 MyBatis-Plus 的查询优化。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.last("limit 1");

        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.last("limit 1");

        // 生成的 SQL:SELECT * FROM user LIMIT 1
    }

33、exists

   exists 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于在查询中添加一个 EXISTS 子查询。通过调用 exists 方法,可以将一个完整的 SQL 子查询作为 EXISTS 条件添加到主查询中。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.exists("select id from table where age = 1");

        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.exists("select id from table where age = 1");

        // 生成的 SQL:SELECT * FROM user WHERE EXISTS (select id from table where age = 1)
    }

34、notExists

   notExists 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于在查询中添加一个 NOT EXISTS 子查询。通过调用 notExists 方法,可以将一个完整的 SQL 子查询作为 NOT EXISTS 条件添加到主查询中。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.notExists("select id from table where age = 1");

        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.notExists("select id from table where age = 1");

        // 生成的 SQL:SELECT * FROM user WHERE NOT EXISTS (select id from table where age = 1)
    }

35、select

   select 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置查询的字段。通过调用 select 方法,可以指定在查询结果中包含哪些字段,从而实现字段级别的查询定制。

public void test() {
        // 普通 Wrapper (QueryWrapper):
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("id", "name", "age");

        // Lambda Wrapper (LambdaQueryWrapper):
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.select(User::getId, User::getName, User::getAge);

        // 生成的 SQL:SELECT id, name, age FROM user

        // 使用 Predicate 过滤字段的示例:
        queryWrapper.select(i -> i.getProperty().startsWith("test"));

        // 生成的 SQL:SELECT testField1, testField2 FROM user
    }

36、set UpdateWrapper

   set 方法是 MyBatis-Plus 中用于构建更新操作的高级方法之一,它用于设置更新语句中的 SET 字段。通过调用 set 方法,可以指定在更新操作中要修改的字段及其新值。

public void test() {
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("name", "老李头");

        LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        lambdaUpdateWrapper.set(User::getName, "老李头");

        // 生成的 SQL:UPDATE user SET name = '老李头'

        // 使用条件控制的示例:
        updateWrapper.set(true, "name", "");

        // 生成的 SQL:UPDATE user SET name = ''
    }

37、setSql UpdateWrapper

   setSql 方法是 MyBatis-Plus 中用于构建更新操作的高级方法之一,它允许你直接设置更新语句中的 SET 部分 SQL。通过调用 setSql 方法,可以将一个自定义的 SQL 片段作为 SET 子句添加到更新语句中。

public void test() {
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql("name = '老李头'");

        LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        lambdaUpdateWrapper.setSql("name = '老李头'");

        // 生成的 SQL:UPDATE user SET name = '老李头'
    }

38、setIncrBy 自增 setDecrBy 自减

        该方法需要版本在3.5.6以上。

  • setIncrBy 方法是 MyBatis-Plus 中用于更新操作的高级方法之一,它允许你指定一个字段,并使其在数据库中的值增加指定的数值。这个方法特别适用于需要对数值字段进行增量操作的场景。
  • setDecrBy 方法是 MyBatis-Plus 中用于更新操作的高级方法之一,它允许你指定一个字段,并使其在数据库中的值减少指定的数值。这个方法特别适用于需要对数值字段进行减量操作的场景。

39、lambda

   lambda 方法是一个便捷的方法,它允许你从 QueryWrapper 或 UpdateWrapper 对象中获取对应的 LambdaQueryWrapper 或 LambdaUpdateWrapper 对象。这样,你就可以使用 Lambda 表达式来构建查询或更新条件,使得代码更加简洁和类型安全。

public void test() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        LambdaQueryWrapper<User> lambdaQueryWrapper = queryWrapper.lambda();
        // 使用 Lambda 表达式构建查询条件
        lambdaQueryWrapper.eq(User::getName, "张三");

        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        LambdaUpdateWrapper<User> lambdaUpdateWrapper = updateWrapper.lambda();
        // 使用 Lambda 表达式构建更新条件
        lambdaUpdateWrapper.set(User::getName, "李四");
    }

40、Wrappers

        MyBatis-Plus 提供了 Wrappers 类,它是一个静态工厂类,用于快速创建 QueryWrapperUpdateWrapperLambdaQueryWrapper 和 LambdaUpdateWrapper 的实例。使用 Wrappers 可以减少代码量,提高开发效率。

public void test() {
        // 创建 QueryWrapper
        QueryWrapper<User> queryWrapper = Wrappers.query();
        queryWrapper.eq("name", "张三");

        // 创建 LambdaQueryWrapper
        LambdaQueryWrapper<User> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(User::getName, "张三");

        // 创建 UpdateWrapper
        UpdateWrapper<User> updateWrapper = Wrappers.update();
        updateWrapper.set("name", "李四");

        // 创建 LambdaUpdateWrapper
        LambdaUpdateWrapper<User> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
        lambdaUpdateWrapper.set(User::getName, "李四");
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/737105.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GPT-5大幅推迟?OpenAI CTO称将在2025年底到2026年初推出

GPT-5大幅推迟&#xff1f;OpenAI CTO称将在2025年底到2026年初推出 OpenAI CTO同时透露&#xff0c;GPT-5性能将有巨大飞跃&#xff0c;在某些特定任务中达到“博士水平”智能&#xff0c;此前市场曾预测GPT-5可能在2023年底或2024年夏季发布。 一再跳票的GPT-5可能大幅推迟…

Git客户端安装步骤详解

git windows7 百度经验:jingyan.baidu.com 方法/步骤 1 从git官网下一个git安装包。 步骤阅读 2 点击git.exe安装程序&#xff0c;点击【next】 ![git的安装和配置](https://imgsa.baidu.com/exp/w500/sign7565f44ba58b87d65042ab1f37092860/21a4462309f790525e5b0144…

STM32 Customer BootLoader 刷新项目 (二) 方案介绍

STM32 Customer BootLoader 刷新项目 (二) 方案介绍 文章目录 STM32 Customer BootLoader 刷新项目 (二) 方案介绍1. 需求分析2. STM32 Memery介绍3. BootLoader方案介绍4. 支持指令 1. 需求分析 首先在开始编程之前&#xff0c;我们先详细设计一下BootLoder的方案。 本项目做…

自动驾驶规划中使用 OSQP 进行二次规划 代码原理详细解读

目录 1 问题描述 什么是稀疏矩阵 CSC 形式 QP Path Planning 问题 1. Cost function 1.1 The first term: 1.2 The second term: 1.3 The thrid term: 1.4 The forth term: 对 Qx 矩阵公式的验证 整体 Q 矩阵&#xff08;就是 P 矩阵&#xff0c;二次项的权重矩阵&…

【数据库】六、事务与并发控制(封锁)

六、事务与并发控制 文章目录 六、事务与并发控制1.事务1.1事务的ACID特性1.2MySQL事务控制语句开启事务提交事务回滚事务 2.并发控制2.1并发执行可能引起的问题2.1.1丢失更新2.1.2不可重复读2.1.3读脏数据 2.2并发调度的可串行性2.3并发与并行的区分2.4事务的隔离级别 3.封锁3…

36.Http协议的设计与解析

Http协议比Redis协议复杂的多,如果程序员自己去实现,工作量大。 Netty已经把Http协议的编解码器实现好了,只需要简单的配置就可以使用。 做一个http的服务端需要HttpServerCodec。 看它继承的父类: 结合了两个类: HttpRequestDecoder(入站处理器extends Channelnbound…

数据库的概念-数据库、数据库管理系统、数据库系统、数据库管理员、数据库设计人员、开发管理使用数据库系统的人员

一、数据库&#xff08;DB&#xff09; 1、数据库就是存储数据的仓库&#xff0c;只不过这个仓库是在计算机存储设备上 2、严格的说&#xff0c;数据库是长期存储在计算机内、有组织的、统一管理的、可共享的相关数据的集合 3、数据库应是为一个特定目标而设计、构建并装入数…

PriorityQueue详解(含动画演示)

目录 PriorityQueue详解1、PriorityQueue简介2、PriorityQueue继承体系3、PriorityQueue数据结构PriorityQueue类属性注释完全二叉树、大顶堆、小顶堆的概念☆PriorityQueue是如何利用数组存储小顶堆的&#xff1f;☆利用数组存储完全二叉树的好处&#xff1f; 4、PriorityQueu…

酒店宾馆民宿预订管理系统(ThinkPHP+uniapp+uView)

便捷高效&#xff0c;轻松管理你的住宿预订&#x1f3e8; 基于ThinkPHPuniappuView开发的多门店民宿酒店预订管理系统&#xff0c;快速部署属于自己民宿酒店的预订小程序&#xff0c;包含预订、退房、WIFI连接、吐槽、周边信息等功能。​​ 一、引言&#xff1a;为何需要民宿…

Spring Boot+vue社区养老系统(智慧养老平台)

使用技术&#xff1a; springbootvueMySQL 主要功能&#xff1a; 管理员 登录个人资料密码管理, 用户管理:床位类型管理,床位管理,护工管理,老人管理 咨询登记管理&#xff0c;预约登记管理,老人健康信 息管理,费用管理等功能.护工角色包含以下功能: 护工登录&#xff0c;个…

使用 GCD 实现属性的多读单写

使用 Grand Central Dispatch (GCD) 实现多读单写的属性 首先需要确保在多线程环境下的线程安全性。可以使用 GCD 提供的读写锁机制 dispatch_rwlock_t 或者 dispatch_queue_t 来实现这个功能。 Swift版本的实现 怎样创建一个并发队列 &#xff1f;// 使用 Swift 来实现的首…

UE5 中的碰撞问题

文章目录 一、初始准备二、重叠和碰撞三、自定义碰撞 一、初始准备 首先我们创建一个 BP_ThirdPerson 项目&#xff0c;然后在项目中创建两个 Actor 的蓝图 Blueprint 首先是一个移动的 BP_Push&#xff0c;这里使用 time line 循环旋转 cube 的相对位置 得到效果如下 然后是…

css如何动态累计数字?

导读&#xff1a;css如何动态累计数字&#xff1f;用于章节目录的序列数生成&#xff0c;用css的计数器实现起来比 js方式更简单&#xff01; 伪元素 ::after ::before伪元素设置content 可以在元素的首部和尾部添加内容&#xff0c;我们要在元素的首部添加序列号&#xff0c…

关于read,write,open时出现的文本文件和二进制文件读写的问题(怎么写入怎么读)

1、发现问题 使用read读取文本文件&#xff0c;一般采用字符空间作为缓存&#xff0c;最后输出&#xff1b; 使用read读取二进制文件&#xff0c;这里采用整数读取的展示&#xff1a; 首先创建文本文件&#xff0c;用write写入i的值到文件中&#xff1b; 再通过lseek改变读写一…

Day9 —— 大数据技术之ZooKeeper

ZooKeeper快速入门系列 ZooKeeper的概述什么是ZooKeeper&#xff1f;ZooKeeper的特点和功能使用ZooKeeper的原因 ZooKeeper数据模型ZooKeeper安装ZooKeeper配置ZooKeeper命令行操作常见服务端命令 ZooKeeper的概述 什么是ZooKeeper&#xff1f; ZooKeeper是一个开源的分布式协…

FFmpeg编译4

CPUx86-64 TOOLCHAIN N D K / t o o l c h a i n s / x 8 6 6 4 − 4.9 / p r e b u i l t / l i n u x − x 8 6 6 4 S Y S R O O T NDK/toolchains/x86_64-4.9/prebuilt/linux-x86_64 SYSROOT NDK/toolchains/x866​4−4.9/prebuilt/linux−x866​4SYSROOTNDK/platforms/and…

PBR网络数据流量分流+NQA联动静态路由

一、实验目的&#xff1a; 企业有两个网段&#xff0c;业务1网段和业务2网段&#xff0c;拓扑图如下&#xff0c; 二、实验要求 pc1报文走左侧链路到达ar1&#xff0c;pc2报文走右侧链路到达ar1&#xff0c;且当ar2或者ar3发生故障时候&#xff0c;可以通过另一个设备到达ar1…

HCIA 19 结束 企业总部-分支综合实验(下)

3.6出口NAT配置可以访问互联网 配置NAT使内网可以访问公网8.8.8.8&#xff0c;当前总部PC1 PING不通公网地址8.8.8.8。 3.6.1总部配置NAT访问互联网 步骤1&#xff1a;配置NAT acl number 2000 rule 5 permit source 192.168.0.0 0.0.255.255 # interface GigabitEthern…

头条系统-05-延迟队列精准发布文章-概述添加任务(db和redis实现延迟任务)、取消拉取任务定时刷新(redis管道、分布式锁setNx)

文章目录 延迟任务精准发布文章1)文章定时发布2)延迟任务概述2.1)什么是延迟任务2.2)技术对比2.2.1)DelayQueue2.2.2)RabbitMQ实现延迟任务2.2.3)redis实现 3)redis实现延迟任务4)延迟任务服务实现4.1)搭建heima-leadnews-schedule模块4.2)数据库准备4.3)安装redis4.4)项目集成…

常用加密算法之 RSA 简介及应用

引言 相关博文&#xff1a; Spring Boot 开发 – 常用加密算法简介&#xff08;一&#xff09;常用加密算法之 SM4 简介及应用 一、RSA算法简介 RSA &#xff08;Rivest-Shamir-Adleman&#xff09; 算法是一种非对称加密技术&#xff0c;由Ron Rivest、Adi Shamir和Leonar…