MybatisPlus(SpringBoot版)学习第五讲:条件构造器和常用接口

目录

1.wrapper介绍

2.QueryWrapper

[2.1 例1:组转查询条件](#2.1 例1:组转查询条件)

Compare

Nested

Join

Func

[2.2 例2:组装排序条件](#2.2 例2:组装排序条件)

[2.3 例3:组装删除条件](#2.3 例3:组装删除条件)

[2.4 例4:条件的优先级](#2.4 例4:条件的优先级)

[2.5 例5:组装select子句](#2.5 例5:组装select子句)

[2.6 例6:实现子查询](#2.6 例6:实现子查询)

3.UpdateWrapper

4.Condition

[4.1 思路一](#4.1 思路一)

[4.2 思路二:](#4.2 思路二:)

5.LambdaQueryWrapper

6.LambdaUpdateWrapper


1.wrapper介绍

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

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

QueryWrapper: 查询条件封装

UpdateWrapper: Update 条件封装

AbstractLambdaWrapper: 使用Lambda 语法

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

LambdaUpdateWrapper: Lambda 更新封装Wrapper

ctrl+h


2.QueryWrapper

2.1 例1:组转查询条件

java 复制代码
/***
 * 按查询条件组装
 */
@Test
public void test01(){
   QueryWrapper<People> queryWrapper=new QueryWrapper<>();
   //SELECT id,username AS name,age,email,is_deleted
   // FROM t_people
   // WHERE is_deleted=0 AND (username LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
   queryWrapper.like("username","a")
         .between("age",20,30)
         .isNotNull("email");
   List<People> list=peopleMapper.selectList(queryWrapper);
   list.forEach(System.out::println);
}

QueryWrapper继承AbstractWrapper,我们点击AbstractWrapper进去看看。

我们能看到AbstrackWrapper实现了这四个接口。

Compare

  • 作用 :用于构建比较条件,比如等于(eq)、不等于(ne)、大于(gt)、小于(lt)等条件。在构建 SQL 查询条件时,可用来描述实体属性和具体值之间的比较关系 。

Nested

  • 作用:用于构建嵌套查询条件,当需要在查询条件中添加括号包裹的子条件时会用到。可以让查询条件的逻辑结构更清晰,实现复杂的条件组合。

Join

  • 作用 :主要用于处理 SQL 的连接操作,比如内连接(INNER JOIN)、左连接(LEFT JOIN)等。在多表查询场景下,通过它来定义表与表之间的连接关系。

Func

  • 作用:是一个函数式接口,通常用于封装一些可复用的条件构建逻辑。可以将条件构建的代码块作为参数传递,方便代码的复用和逻辑组织。

我们能够看到,他们都是默认的方法, 继承他的类可以直接使用这个方法,也可以进行重写。同IService原码

2.2 例2:组装排序条件

java 复制代码
/***
 * 按排序组装
 */
@Test
public void test02(){
   QueryWrapper<People> queryWrapper=new QueryWrapper<>();
   queryWrapper.orderByDesc("age")
         .orderByAsc("id");
   List<People> list=peopleMapper.selectList(queryWrapper);
   list.forEach(System.out::println);
}

2.3 例3:组装删除条件

java 复制代码
/***
 * 组装删除条件
 */
@Test
public void test03(){
   QueryWrapper<People> queryWrapper=new QueryWrapper<>();
   queryWrapper.isNull("email");
   int result=peopleMapper.delete(queryWrapper);
   System.out.println("受影响的行数:"+result);
}

2.4 例4:条件的优先级

java 复制代码
/***
 * 优先级
 */
@Test
public void test04(){
   QueryWrapper<People> queryWrapper=new QueryWrapper<>();
   //UPDATE t_people SET age=?, email=? 
   // WHERE is_deleted=0 AND (username LIKE ? AND age > ? OR email IS NULL)
   queryWrapper.like("username", "a")
         .gt("age", 20)
         .or()
         .isNull("email");
   People people=new People();
   people.setAge(18);
   people.setEmail("[email protected]");
   int result=peopleMapper.update(people,queryWrapper);
   System.out.println("受影响的行数:" + result);
}

lambda表达式里的逻辑优先算法

java 复制代码
/***
 * lambda表达式里的逻辑优先算法
 */
@Test
public void test05(){
   QueryWrapper<People> queryWrapper=new QueryWrapper<>();
   //UPDATE t_people SET age=?, email=?
   // WHERE is_deleted=0 AND (username LIKE ? AND (age > ? OR email IS NULL))
   queryWrapper.like("username",'a')
         .and(i ->i.gt("age",20).or().isNull("email"));
   People people=new People();
   people.setAge(18);
   people.setEmail("[email protected]");
   int result=peopleMapper.update(people,queryWrapper);
   System.out.println("受影响的行数:" + result);
}

2.5 例5:组装select子句

java 复制代码
/***
 * 组装select语句
 */
@Test
public void test06(){
   //查询用户信息的username和age字段
   //SELECT username,age FROM t_people
   QueryWrapper<People> queryWrapper=new QueryWrapper<>();
   queryWrapper.select("username","age");
   //selectMaps()返回Map集合列表,通常配合select()使用,
   // 避免People对象中没有被查询到的列值 为null
   List<Map<String,Object>> maps=peopleMapper.selectMaps(queryWrapper);
   maps.forEach(System.out::println);
}

2.6 例6:实现子查询

java 复制代码
/***
 * 实现子查询
 */
@Test
public void test07(){
   //SELECT id,username AS name,age,email,is_deleted FROM t_people 
   // WHERE is_deleted=0 AND (id IN (select id from t_people where id<=3))
   QueryWrapper<People> queryWrapper=new QueryWrapper<>();
   queryWrapper.inSql("id","select id from t_people where id<=3");
   List<People> list=peopleMapper.selectList(queryWrapper);
   list.forEach(System.out::println);
}

3.UpdateWrapper

java 复制代码
/***
 * UpdateWrapper
 */
@Test
public void test08(){
   //将(年龄大于20或邮箱为null)并且用户名中包含有a的用户信息修改
   //组装set子句以及修改条件
   UpdateWrapper<People> updateWrapper=new UpdateWrapper<>();
   //lambda表达式内的逻辑优先运算
   updateWrapper
         .set("age", 18)
         .set("email", "[email protected]")
         .like("username", "a")
         .and(i -> i.gt("age", 20).or().isNull("email"));
   //UPDATE t_people SET age=?,email=?
   // WHERE is_deleted=0 AND
   // (username LIKE ? AND (age > ? OR email IS NULL))
   int result = peopleMapper.update(null, updateWrapper);
   System.out.println(result);
}

Lambda 表达式是 Java 8引入的一个新特性,它可以让你以更简洁的方式表示一个匿名函数。

在这个例子中,i -> i.gt("age", 20).or().isNull("email") 表示一个接受一个参数 i,并对其进行一系列操作的函数。

参数 i 通常是 MyBatis-Plus 中的 QueryWrapper 或者 UpdateWrapper 对象,它们用于构建 SQL 查询或者更新语句的条件部分。


4.Condition

在真正开发的过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因 此我们在组装这些条件时,必须先判断用户是否选择了这些条件 ,若选择则需要组装该条件,若 没有选择则一定不能组装,以免影响SQL执行的结果

4.1 思路一

使用StringUtils的前提

XML 复制代码
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>3.12.0</version>
</dependency>
java 复制代码
@Test
public void test09(){
   //定义查询条件,有可能为null(用户未输入或未选择)
   String username=null;
   Integer ageBegin = 10;
   Integer ageEnd = 24;
   QueryWrapper<People> queryWrapper = new QueryWrapper<>();
   //StringUtils.isNotBlank()判断某字符串是否不为空且长度不为0且不由空白符(whitespace) 构成
   if(StringUtils.isNotBlank(username)){
      queryWrapper.like("username","a");
   }
   if(ageBegin != null){
      queryWrapper.ge("age", ageBegin);
   }
   if(ageEnd != null){
      queryWrapper.le("age", ageEnd);
   }
   //SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (age >= ? AND age <= ?)
   List<People> peoples = peopleMapper.selectList(queryWrapper);
   peoples.forEach(System.out::println);
}

4.2 思路二:

上面的实现方案没有问题,但是代码比较复杂,我们可以使用带condition参数的重载方法构建查 询条件,简化代码的编写

java 复制代码
@Test
public void test09UseCondition(){
   //定义查询条件,有可能为null(用户未输入或未选择)
   String username = null;
   Integer ageBegin = 10;
   Integer ageEnd = 24;
   QueryWrapper<People> queryWrapper = new QueryWrapper<>();
//StringUtils.isNotBlank()判断某字符串是否不为空且长度不为0且不由空白符(whitespace) 构成
   queryWrapper
         .like(StringUtils.isNotBlank(username), "username", "a")
         .ge(ageBegin != null, "age", ageBegin)
         .le(ageEnd != null, "age", ageEnd);
//SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (age >= ? AND age <= ?)
   List<People> peoples = peopleMapper.selectList(queryWrapper);
   peoples.forEach(System.out::println);
}

5.LambdaQueryWrapper

java 复制代码
    /***
    * LambdaQueryWrapper
    */
   @Test
   public void test10() {
//定义查询条件,有可能为null(用户未输入)
      String username = "a";
      Integer ageBegin = 10;
      Integer ageEnd = 24;
      LambdaQueryWrapper<People> queryWrapper = new LambdaQueryWrapper<>();
//避免使用字符串表示字段,防止运行时错误
      queryWrapper
            .like(StringUtils.isNotBlank(username), People::getName, username)
            .ge(ageBegin != null, People::getAge, ageBegin)
            .le(ageEnd != null, People::getAge, ageEnd);
      //SELECT id,username AS name,age,email,is_deleted FROM t_people 
      // WHERE is_deleted=0 AND (username LIKE ? AND age >= ? AND age <= ?)
      List<People> peoples = peopleMapper.selectList(queryWrapper);
      peoples.forEach(System.out::println);
   }

在 Java 里,People::getAge 属于方法引用的一种形式。方法引用是 Java 8 引入的特性,它能够让你直接引用已有的方法,而无需显式调用该方法。一般用于 Lambda 表达式能使用的地方,从而让代码更简洁。


6.LambdaUpdateWrapper

java 复制代码
/***
 * 使用LambdaUpdateWrapper
 */
@Test
public void test11(){
   LambdaUpdateWrapper<People> updateWrapper=new LambdaUpdateWrapper<>();
   //UPDATE t_people SET age=?, age=?,email=? WHERE is_deleted=0 AND (username LIKE ? AND (age < ? OR email IS NULL))
   updateWrapper
         .set(People::getAge,18)
         .set(People::getEmail,"[email protected]")
         .like(People::getName,"a")
         .and(i ->i.lt(People::getAge,24).or().isNull(People::getEmail));//lambda 表达式内的逻辑优先运算
   People people=new People();
   int result=peopleMapper.update(people,updateWrapper);
   System.out.println("受影响的行数:" + result);
}
相关推荐
triticale9 分钟前
【图论】最短路径问题总结
java·开发语言·图论
技术小齐11 分钟前
网络运维学习笔记(DeepSeek优化版)026 OSPF vlink(Virtual Link,虚链路)配置详解
运维·网络·学习
暮辰77712 分钟前
多JDK环境安装及切换使用
java
qq_4476630520 分钟前
Spring的事务处理
java·后端·spring
男Ren、麦根28 分钟前
Java抽象类:深入理解与应用
java·开发语言
Foyo Designer40 分钟前
【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的消息队列:使用 RabbitMQ 实现异步处
java·spring boot·程序人生·spring·职场和发展·rabbitmq·java-rabbitmq
小钊(求职中)41 分钟前
七种分布式ID生成方式详细介绍--Redis、雪花算法、号段模式以及美团Leaf 等
java·spring boot·分布式·spring·mybatis
martian6651 小时前
分布式并发控制实战手册:从Redis锁到ZK选主的架构之道
java·开发语言·redis·分布式·架构
西岭千秋雪_1 小时前
Spring Boot自动配置原理解析
java·spring boot·后端·spring·springboot
日暮南城故里1 小时前
常用的排序算法------练习4
java·数据结构·算法