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() {// 创建 QueryWrapperQueryWrapper<User> queryWrapper = Wrappers.query();queryWrapper.eq("name", "张三");// 创建 LambdaQueryWrapperLambdaQueryWrapper<User> lambdaQueryWrapper = Wrappers.lambdaQuery();lambdaQueryWrapper.eq(User::getName, "张三");// 创建 UpdateWrapperUpdateWrapper<User> updateWrapper = Wrappers.update();updateWrapper.set("name", "李四");// 创建 LambdaUpdateWrapperLambdaUpdateWrapper<User> lambdaUpdateWrapper = Wrappers.lambdaUpdate();lambdaUpdateWrapper.set(User::getName, "李四");}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

apksigner jarsigner.md

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、apksigner3.2 为 APK 签名3.3 验证…

python 字符串驻留机制

偶然发现一个python字符串的现象&#xff1a; >>> a 123_abc >>> b 123_abc >>> a is b True >>> c abc#123 >>> d abc#123 >>> c is d False 这是为什么呢&#xff0c;原来它们的id不一样。 >>> id(a)…

使用AGG里面的clip_box函数裁剪画布, 绘制裁剪后的图形

// 矩形裁剪图片, 透明 void agg_testImageClipbox_rgba32(unsigned char* buffer, unsigned int width, unsigned int height) {// 创建渲染缓冲区 agg::rendering_buffer rbuf;// BMP是上下倒置的&#xff0c;为了和GDI习惯相同&#xff0c;最后一个参数是负值。rbuf.attach…

CausalMMM:基于因果结构学习的营销组合建模

1. 摘要 在线广告中&#xff0c;营销组合建模&#xff08;Marketing Mix Modeling&#xff0c;MMM&#xff09; 被用于预测广告商家的总商品交易量&#xff08;GMV&#xff09;&#xff0c;并帮助决策者调整各种广告渠道的预算分配。传统的基于回归技术的MMM方法在复杂营销场景…

34 - 指定日期的产品价格(高频 SQL 50 题基础版)

34 - 指定日期的产品价格 -- row_number(行号) 生成连续的序号&#xff0c;不考虑分数相同 -- 在2019-08-16之前改的价格&#xff0c;使用最近一期的日期&#xff0c;没有在2019-08-16之前改的价格&#xff0c;默认价格为10 select t.product_id, t.new_price as price from (s…

华为某员工爆料:三年前985本科起薪30万,现在硕士起薪还是30w,感慨互联网行情变化

“曾经的30万年薪&#xff0c;是985本科学历的‘标配’&#xff0c;如今硕士也只值这个价&#xff1f;” 一位华为员工的爆料&#xff0c;揭开了互联网行业薪资变化的冰山一角&#xff0c;也引发了不少人的焦虑&#xff1a;互联网人才“通货膨胀”的时代&#xff0c;真的结束了…

板凳-------unix 网络编程 卷1-1简介

unix网络编程进程通信 unpipc.h https://blog.csdn.net/u010527630/article/details/33814377?spm1001.2014.3001.5502 订阅专栏 1>解压源码unpv22e.tar.gz。 $tar zxvf unpv22e.tar.gz //这样源码就被解压到当前的目录下了 2>运行configure脚本&#xff0c;以生成正确…

【区块链】区块链架构设计:从原理到实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 区块链架构设计&#xff1a;从原理到实践引言一、区块链基础概念1.1 区块链定义…

k8s上使用ConfigMap 和 Secret

使用ConfigMap 和 Secret 实验目标&#xff1a; 学习如何使用 ConfigMap 和 Secret 来管理应用的配置。 实验步骤&#xff1a; 创建一个 ConfigMap 存储应用配置。创建一个 Secret 存储敏感信息&#xff08;如数据库密码&#xff09;。在 Pod 中挂载 ConfigMap 和 Secret&am…

荣耀社招 测试工程师 技术一面

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 1、自我介绍 2、具体介绍做过的项目&#xff0c;支撑的事什么业务 3、防火墙测试时、平时有写脚本或者使用第三方工具吗 4、对互联网的安全测试规…

浏览器插件利器-allWebPluginV2.0.0.14-bata版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持谷歌、火狐等浏…

DataStructure.时间和空间复杂度

时间和空间复杂度 【本节目标】1. 如何衡量一个算法的好坏2. 算法效率3. 时间复杂度3.1 时间复杂度的概念3.2 大O的渐进表示法3.3 推导大O阶方法3.4 常见时间复杂度计算举例3.4.1 示例13.4.2 示例23.4.3 示例33.4.4 示例43.4.5 示例53.4.6 示例63.4.7 示例7 4.空间复杂度4.1 示…

从零开始搭建一个酷炫的个人博客

效果图 一、搭建网站 git和hexo准备 注册GitHub本地安装Git绑定GitHub并提交文件安装npm和hexo&#xff0c;并绑定github上的仓库注意&#xff1a;上述教程都是Windows系统&#xff0c;Mac系统会更简单&#xff01; 域名准备 购买域名&#xff0c;买的是腾讯云域名&#xf…

神经网络实战1-Sequential

链接&#xff1a;https://pytorch.org/docs/1.8.1/generated/torch.nn.Sequential.html#torch.nn.Sequential 完成这样一个网络模型 第一步新建一个卷积层 self.conv1Conv2d(3,32,5)#第一步将33232输出为32通道&#xff0c;卷积核5*5 注意一下&#xff1a;输出通道数等于卷积…

JavaSE基础总结复习之面向对象の知识总结

目录 Java语言的基础特点 面向对象 类和对象 类 类的构造 一&#xff0c;发现类 二&#xff0c;发现类的共有属性&#xff08;成员变量&#xff09; 三&#xff0c;定义类的成员方法&#xff08;行为&#xff0c;动词&#xff09; 四&#xff0c;使用类创建对象 对象…

用TensorRT-LLM进行LLama的推理和部署

Deploy an AI Coding Assistant with NVIDIA TensorRT-LLM and NVIDIA Triton | NVIDIA Technical BlogQuick Start Guide — tensorrt_llm documentation (nvidia.github.io) 使用TensorRT-LLM的源码&#xff0c;来下载docker并在docker里编译TensorRT-LLM&#xff1b; 模型…

Eureka 服务注册与发现

目录 前言 注册中心 CAP 理论 常⻅的注册中心 CAP理论对比 Eureka 搭建 Eureka Server 引⼊ eureka-server 依赖 完善启动类 编写配置⽂件 启动服务 服务注册 引⼊ eureka-client 依赖 完善配置⽂件 启动服务 服务发现 引⼊依赖 完善配置⽂件 远程调⽤ 启动…

江协科技51单片机学习- p16 矩阵键盘

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

web安全渗透测试十大常规项(一):web渗透测试之JAVA反序列化

渗透测试之PHP反序列化 1. Java反序列化1.1 Java安全-反序列化-原生序列化类函数1.1.1 原生序列化类函数:1.2 Java安全-SpringBoot框架-泄漏&CVE1. Java反序列化 1、序列化与反序列化 序列化:将内存中的对象压缩成字节流 反序列化:将字节流转化成内存中的对象2、为什么…

数据仓库和数据库有什么区别?

一、什么是数据仓库二、什么是数据库三、数据仓库和数据库有什么区别 一、什么是数据仓库 数据仓库&#xff08;Data Warehouse&#xff09;是一种专门用于存储和管理大量结构化数据的信息系统。它通过整合来自不同来源的数据&#xff0c;为企业提供统一、一致的数据视图&…