MyBatisPlus全套视频教程|mybatis百科大全式讲解,深入浅出实战精讲
不想看文字的可跟着视频学习:
1. 【入门篇】
1.1初识MybatisPlus
1.11Mybatis框架回顾
MybatisPlus,从名称上来看,我们就发现,他和Mybatis长得很像,其实MybatisPlus就是Mybatis的孪生兄弟,在学习MybatisPlus之前,我们先来回顾一下Mybatis框架的搭建流程。
什么是Mybatis框架呢,他是一个持久层框架,目的是简化持久层的开发。在这里我们就使用springboot整合Mybatis,实现Mybatis框架的搭建。
【1】工程结构创建
我们首先创建一个空的工程
编辑
工程名称是mp
编辑
创建springboot模块
编辑
编辑
这里我们选择springboot2.7.8的版本,并不勾选依赖,随后通过pom.xml手动添加
编辑
创建后的结构如下
编辑
【2】创建数据库,表结构,导入表数据
创建数据库mybatisplus
编辑
建表语句
DROP TABLE IF EXISTS user;CREATE TABLE user( id BIGINT(20) NOT
NULL COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT(11) NULL DEFAULT NULL COMMENT '年龄', email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',PRIMARY KEY (id)); |
插入数据
DELETE FROM user;INSERT INTO user (id, name, age, email) VALUES(1, 'Jone', 18, 'test1@baomidou.com'),(2, 'Jack', 20, 'test2@baomidou.com'),(3, 'Tom', 28, 'test3@baomidou.com'),(4, 'Sandy', 21, 'test4@baomidou.com'),(5, 'Billie', 24, 'test5@baomidou.com'); |
【3】 引入相关依赖
mysql mysql-connector-java 5.1.47
org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.3 org.springframework.boot spring-boot-starter-web org.projectlombok lombok |
【4】 创建domain包,编写实体类,实体类的数据类型和表字段类型一致
编辑
Lombok可以极大的省略类的代码量,使代码更加的简洁。
Lombok相关常用注解
@Data 注解在类上,提供类的get、set、equals、hashCode、toString等方法
@AllArgsConstructor 注解在类上,提供满参构造
@NoArgsConstructor 注解在类上,提供空参构造
package com.powernode.domain; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.NoArgsConstructor;@Data @AllArgsConstructor @NoArgsConstructor public class User { ** // **主键 ****private Long id; ** // **姓名 ****private String name; ** // **年龄 ****private Integer age; ** // **邮箱 ****private String email; } |
【5】 创建mapper包,编写Mapper接口
编辑
@Mapper作用在接口上,扫描到该注解后,会根据接口创建该接口的实现类对象
import com.powernode.domain.User; import
org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface UserMapper { public List selectList(); } |
【6】 编写映射文件
编辑
** select * from user |
【7】 创建service包,编写Service
编辑
package com.powernode.service; import com.powernode.domain.User;
import java.util.List; public interface UserService { List selectAll(); } |
【8】 编写ServiceImpl
编辑
package com.powernode.service.impl; import
com.powernode.domain.User; import com.powernode.mapper.UserMapper; import com.powernode.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List selectAll() { return userMapper.selectAll(); } } |
【9】 编写Controller
编辑
package com.powernode.controller; import com.powernode.domain.User;
import com.powernode.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class UserController { @Autowired private UserService userService; @RequestMapping("/selectAll") public List selectAll(){ List users = userService.selectAll(); return users; } } |
【10】 将配置文件改为yml格式,编写配置文件
编辑
spring: datasource: password: root username: root
driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false |
【11】 测试结果
请求controller接口,发现响应了数据,至此Mybatis环境开发完毕
编辑
1.12 . Mybatis框架的开发效率问题分析
我们来思考一下,Mybatis框架的开发效率怎么样?
开发效率也就是我们使用这款框架开发的速度快不快,是否简单好用易上手。从这个角度思考,每当我们需要编写一个SQL需求的时候,我们需要做几步
【1】Mapper接口提供一个抽象方法
【2】Mapper接口对应的映射配置文件提供对应的标签和SQL语句
【3】在Service中依赖Mapper实例对象
【4】调用Mapper实例中的方法
【5】在Controller中依赖Service实例对象
【6】调用Service实例中的方法
通过上面的发现,对于一个SQL需求,无论是单表还是多表,我们是需要完成如上几步,才能实现SQL需求的开发
但是在开发中,有一些操作是通用逻辑,这些通用逻辑是可以被简化的,例如:
【1】对于dao,是否可以由框架帮我们提供好单表的Mapper抽象方法,和对应的SQL实现,不需要程序员去实现这些
【2】对于service,使用可以有框架直接帮我们提供好一些service的抽象方法,和对应的实现,不需要程序员去实现这些
【3】一些其他的企业开发中所需要的操作
分析到这里我们发现,其实核心框架并没有发生变化,依然还是Mybatis,只不过我们希望对于Mybatis进行一些封装和进化,让它更加的好用,更加的易用。
MybatisPlus它来了,他是Mybatis的一款增强工具。
1.13. MybatisPlus的介绍
MyBatis-Plus (opens new window) (简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
愿景
我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
编辑
1.14. MybatisPlus的特性讲解
特性
- 无侵入 :只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小 :启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作 :内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用 :通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成 :支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式 :支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作 :支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器 :采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件 :基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 分页插件支持多种数据库 :支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件 :可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件 :提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
支持数据库
任何能使用 MyBatis 进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下,如果不在下列表查看分页部分教程 PR 您的支持。
MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb
达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库
1.15. MybatisPlus的架构模型
编辑
1.16 小结
本章节主要介绍了传统的Mybatis框架的开发效率问题,通过发现问题,我们期望得到一款增强工具,在不改变Mybatis核心原理的同时,解决Mybatis开发效率问题,并提供其他数据库所需要的功能。
通过了解MybatisPlus,我们得知,它是一款国产的增强工具,极大的简化了Mybatis框架操作,降低了Mybatis框架的学习成本,提高了开发效率,在国内十分流行。
1.2 入门案例
1.21准备相关开发环境
IDEA 2021.3.1
PostMan 10.6.7
Navicat 15.0.9
Mysql 5.7.27
JDK8 1.8.0_311
以上环境各位同学之前一定接触过,没有安装的自行安装,在这里就不再演示安装了
另外本课程需要有Mybatis和springboot相关的基础,如果没有这部分基础的同学,需要先回顾相关课程,然后再继续本课程的学习
1.22 搭建springboot工程
编辑
编辑
1.23 创建表结构
创建数据库mybatisplus
编辑
建表语句
DROP TABLE IF EXISTS user;CREATE TABLE user( id BIGINT(20) NOT
NULL COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT(11) NULL DEFAULT NULL COMMENT '年龄', email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (id)); |
1.24 添加表数据
插入数据
DELETE FROM user;INSERT INTO user (id, name, age, email) VALUES(1, 'Jone', 18, 'test1@baomidou.com'),(2, 'Jack', 20, 'test2@baomidou.com'),(3, 'Tom', 28, 'test3@baomidou.com'),(4, 'Sandy', 21, 'test4@baomidou.com'),(5, 'Billie', 24, 'test5@baomidou.com'); |
1.25 引入相关依赖
com.baomidou mybatis-plus-boot-starter 3.5.3
mysql mysql-connector-java com.alibaba druid 1.1.16 org.projectlombok lombok org.springframework.boot spring-boot-starter-web |
1.26 创建实体类
package com.powernode.domain; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class User { private Long id; private String name; private Integer age; private String email; } |
1.27****集成MybatisPlus
【1】编写Mapper接口
package com.powernode.mapper; import
com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.powernode.domain.User; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper extends BaseMapper { } |
【2】 编写Service接口
package com.powernode.service; import com.powernode.domain.User;
import java.util.List; public interface UserService { List selectList(); } |
【3】 编写ServiceImpl
@Service public class UserServiceImpl implements UserService {
@Autowired UserMapper userMapper; public List selectList(){ return userMapper.selectList(null); } } |
【4】 编写Controller
import com.powernode.domain.User; import
com.powernode.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class UserController { @Autowired UserService userService; @RequestMapping("/selectList") public String selectList() { List all; all = userService.selectList(); return all.toString(); } } |
【5】 编写配置文件
spring: datasource: password: root username: root
driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false |
1.28 测试效果 ****
编辑
1.29 单元测试
到此,模拟开发的三层我们就测试完了, 因为Controller和Service都是之前的知识,所以后面我们测试MybatisPlus的代码,通过单元测试的方式来编写
@SpringBootTest class Mp02ApplicationTests { @Autowired
private UserMapper userMapper; @Test void selectList() { List userList = userMapper.selectList(null); System.out.println(userList); } } |
1.30 精简springboot的相关日志
去除mybatisplus的logo
mybatis-plus: global-config: banner: false |
去除springboot的logo
spring: main: banner-mode: off |
1.31 MybatisPlus的执行日志
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl |
1.32 小结
本章节我们通过编写了一个MybatisPlus的入门案例,体验到了MybatisPlus的便捷性,在后面的学习中,各种各样的MybatisPlus的操作都非常容易上手,可以说MybatisPlus是一款学习成本非常低的增强工具。
2.【基础篇】
2.1 通用Mapper接口介绍
有关于通用Mapper接口,之前我们已经看到了,我们自己编写的Mapper接口继承自BaseMapper接口,由BaseMapper接口提供了很多单表的增删改查相关的操作方法,在入门案例中,我们测试了查询所有的操作。在这一章节,我们介绍一些简单的Mapper接口中的方法,主要是感受一下,Mapper接口中对于单表的增删改查的操作都有涉及。更加高级的一些操作,随后的章节会讲到。
2.11 Mapper接口-简单插入数据
插入一条数据
@Test void insert(){ User user = new User(); user.setId(6L);
user.setName("Mike"); user.setAge(33); user.setEmail("test6@powernode.com"); userMapper.insert(user); } |
2.12 Mapper接口-简单删除数据
根据id删除数据
@Test void deleteOne(){ userMapper.deleteById(6L); } |
2.13 Mapper接口-简单修改数据
测试修改全部数据
@Test void updateById(){ User user = new User();
user.setId(6L); user.setName("迈克"); user.setAge(35); user.setEmail("maike6@powernode.com"); userMapper.updateById(user); } |
测试修改部分数据
@Test void updateById(){ User user = new User();
user.setId(6L); user.setName("Mike"); user.setAge(35); user.setEmail("test6@powernode.com"); userMapper.updateById(user); } |
2.14 Mapper接口-简单查询数据
根据Id查询
@Test void updateById(){ User user = new User();
user.setId(6L); user.setName("Mike"); user.setAge(35); user.setEmail("test6@powernode.com"); userMapper.updateById(user); } |
查询所有
@Test void selectList() { List userList = userMapper.selectList(null); System.out.println(userList); } |
2.15 小结
本章我们测试了通过接口提供的基本增删改查的实现,可以感受到,将来我们有这些增删改查需求的时候,直接找到对应的方法调用,由Mapper接口的代理对象就会直接给我们拼接好指定的SQL语句,完成查询。
本章节我们测试了一些基本的增删改查操作,有关于条件查询、分页查询等高级的查询操作,在随后章节会统一讲解。
2.2 通用service接口介绍
除了Mapper接口,MybatisPlus还提供了IService接口和对应的实现类ServiceImpl,该实现类已经提供好了一些对应的Service相关的方法,在某些场景下,我们可以直接使用ServiceImpl提供的方法,实现对应的功能。
IService接口
编辑
IService接口中包含了service相关的一些增删改查方法
编辑
ServiceImpl实现类
编辑
ServiceImpl实现类提供了service相关的增删改查方法的实现
编辑
UserService接口继承自IService接口
编辑
UserServiceImpl类继承ServiceImpl<UserMapper,User>
编辑
编辑
注入UserService对象,测试相关方法
@Autowired private UserService userService; |
2.21 Service接口-简单插入数据
@Test void insertService(){ User user = new User();
user.setId(7L); user.setName("zhangsan"); user.setAge(35); user.setEmail("zhangsan@powernode.com"); userService.save(user); } |
2.22 Service接口-简单删除数据
@Test void deleteService(){ userService.removeById(7L); } |
2.23 Service接口-简单修改数据
@Test void updateService(){ User user = new User();
user.setId(6L); user.setAge(40); userService.updateById(user); } |
2.24 Service接口-简单查询数据
@Test void selectService(){ List userList = userService.selectList(); System.out.println(userList); } |
2.25 小结
通过继承MybatisPlus提供的Service接口,我们既可以拓展自己的service方法,也可以使用现有的一些service方法
2.3****自定义接口方法
MybatisPlus除了给我们提供了这些丰富的接口方法以外,对于我们自己的需求,也可以编写自定义的接口方法,我们通过自己编写SQL语句的形式,实现想要的SQL需求
2.31 自定义Mapper接口方法
Mapper接口中提供抽象方法
@Mapper public interface UserMapper extends BaseMapper { User selectByName(String name); } |
提供映射配置文件,提供对应的SQL语句
编辑
** select * from user where name = #{value} |
测试自定义的Mapper接口方法
@Test void myMethod(){ User user = userMapper.selectByName("Jone"); System.out.println(user); } |
2.34 小结
通过本章节的学习,我们学会了自定义接口的方法,自定义接口的语法规范和之前编写Mybatis的语法规范一样,所以可以看出,MybatisPlus是无侵入式的,也就是引入了MybatisPlus并不会对于原先的语法造成任何改变。
3.【进阶篇】
3.1 映射
学习过Mybatis的同学应该知道,Mybatis框架之所以能够简化数据库操作,是因为他内部的映射机制,通过自动映射,进行数据的封装,我们只要符合映射规则,就可以快速高效的完成SQL操作的实现。
既然MybatisPlus是基于Mybatis的增强工具,所以也具有这样的映射规则。
我们先来了解一下自动映射规则。
3. 11 自动映射规则
【1】表名和实体类名映射 -> 表名user 实体类名User
【2】字段名和实体类属性名映射 -> 字段名name 实体类属性名name
【3】字段名下划线命名方式和实体类属性小驼峰命名方式映射 ->
字段名 user_email 实体类属性名 userEmail
MybatisPlus支持这种映射规则,可以通过配置来设置
map-underscore-to-camel-case: true 表示支持下划线到驼峰的映射
map-underscore-to-camel-case: false 表示不支持下划线到驼峰的映射
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true |
3.12****表映射
通过@TableName()注解指定映射的数据库表名,就会按照指定的表名进行映射
如:此时将数据库的表名改为powershop_user,要完成表名和实体类名的映射,需要将实体类名也要指定为powershop_user
@Data @AllArgsConstructor @NoArgsConstructor
@TableName("powershop_user") public class User { private Long id; private String name; private Integer age; private String email; } |
如果有很多实体类,对应到数据库中的很多表,我们不需要每个依次配置,只需要配置一个全局的设置,他都会给每个实体类名前面添加指定的前缀,这里我们演示一下全局配置的效果
mybatis-plus: global-config: db-config: table-prefix: powershop_ |
3.13 字段映射
什么场景下会改变字段映射呢?
【1】当数据库字段和表实体类的属性不一致时,我们可以使用@TableField()注解改变字段和属性的映射,让注解中的名称和表字段保持一致
如:此时将数据库字段的名称我们改为username,在根据实体类的属性拼接SQL的使用,就会使用@TableField()中指定的名称username进行拼接,完成查询
@Data @AllArgsConstructor @NoArgsConstructor public class User { @TableField("username") private String name; } |
此时的SQL语句是这样的
SELECT id,username AS name,email FROM powershop_user
【2】数据库字段和表实体类的属性一致,框架在拼接SQL语句的时候,会使用属性名称直接拼接sql语句,例如:
SELECT id,username AS name,age,email,desc FROM powershop_user
这条语句直接进行查询的时候,会出现错误
Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc FROM powershop_user' at line 1
原因是,desc属于关键字,不能直接用于sql查询,要解决这个问题,就需要将desc字段加上``符号,将他变为不是关键字,才能完成查询,那这个问题的根本也是改变生成的SQL语句的字段名称,也就是我们需要通过@TableField()改变实体类的属性名称,将desc变为
desc
,就可以解决这个问题
@Data @AllArgsConstructor @NoArgsConstructor public class User { @TableField("desc") private String desc; } |
编辑
此时可以观察到,框架拼接生成的SQL语句的字段名称变为了
desc
,这样是可以正常完成查询的
3.14 字段失效
当数据库中有字段不希望被查询,我们可以通过@TableField(select = false)来隐藏这个字段,那在拼接SQL语句的时候,就不会拼接这个字段
如:如果不想显示年龄信息,那么可以在age属性上添加这个注解,来隐藏这个字段
@Data @AllArgsConstructor @NoArgsConstructor public class User { @TableField(select = false) private Integer age; } |
生成的SQL语句如下,通过查询生成的SQL语句,发现并没有拼接age字段
编辑
3.15 视图属性
在实际开发中,有些字段不需要数据库存储,但是却需要展示,需要展示也就是意味着实体类中需要存在这个字段,我们称这些实体类中存在但是数据库中不存在的字段,叫做视图字段。
根据之前的经验,框架会默认将实体类中的属性作为查询字段进行拼接,那我们来思考,像这种视图字段,能够作为查询条件么,显示是不能的。因为数据库中没有这个字段,所以查询字段如果包含这个字段,SQL语句会出现问题。我们通过@TableField(exist = false)来去掉这个字段,不让他作为查询字段。
@Data @AllArgsConstructor @NoArgsConstructor public class User { @TableField(exist = false) private Integer online; } |
可以看到查询结果中不包含该字段
编辑
3.16 小结
这一章节,我们讲解了MybatisPlus的映射规则,以及如果通过注解配置来改变这种映射规则。
3.2 条件构造器
3.21 条件构造器介绍
之前我们进行的MybatisPlus的操作,没有涉及到条件查询,实际上在开发需求中条件查询是非常普遍的。接下来我们就来讲解如何使用MybatisPlus完成条件查询。
首先,想要使用MybatisPlus完成条件查询,基于面向对象的思想,万物皆对象,那么查询条件也需要使用对象来完成封装。我们先看一下,在MybatisPlus中,和条件有关的类有哪些,他们之间有什么关系,理清楚了这个,我们在传递条件对象的时候,就很清晰了。
3.22 Wrapper
抽象类,条件类的顶层,提供了一些获取和判断相关的方法
编辑
3.23 AbstractWrapper
抽象类,Wrapper的子类,提供了所有的条件相关方法
编辑
3.24 AbstractLambdaWrapper
抽象类,AbstractWrapper的子类,确定字段参数为方法引用类型
编辑
3.25 QueryWrapper
类,AbstractWrapper的子类,如果我们需要传递String类型的字段信息,创建该对象
编辑
3.26 LambdaQueryWrapper
类,AbstractLambdaWrapper的子类,如果我们需要传递方法引用方式的字段信息,创建该对象
编辑
该图为以上各类的关系,我们在编写代码的时候,只需要关注QueryWrapper和LambdaQueryWrapper
编辑
3.27 小结
通过学习类的继承体系,我们知道,我们需要重点掌握QueryWrapper和LambdaQueryWrapper这两个类,在一般情况下,我们大多选择LambdaQueryWrapper,因为选择这种方式传递参数,不用担心拼写错误问题。
3.3 等值查询
3.31****eq
- 使用QueryWrapper对象,构建查询条件
@Test void eq(){ ** //1. **创建 QueryWrapper 对象 ****QueryWrapper queryWrapper = new QueryWrapper<>(); ** //2. **设置条件,指定 String 字段名称和值 ****queryWrapper.eq("name","Jack"); ** //3. **使用条件完成查询 ****User user = userMapper.selectOne(queryWrapper); System.out.println(user); } |
测试效果
编辑
我们思考如果每次都是自己进行字段名称的编写,有可能会出现名称写错的情况,怎么避免这种情况呢,我们可以使用LambdaQueryWrapper对象,在构建字段时,使用方法引用的方式来选择字段,这样做可以避免字段拼写错误出现问题。
代码如下:
@Test void eq2(){ ** //1. **创建 QueryWrapper 对象 ****LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); ** //2. **设置条件,指定 String 字段名称和值 ****lambdaQueryWrapper.eq(User::getName,"Jack"); ** //3. **使用条件完成查询 ****User user = userMapper.selectOne(lambdaQueryWrapper); System.out.println(user); } |
还要考虑一种情况,我们构建的条件是从哪里来的?应该是从客户端通过请求发送过来的,由服务端接收的。在网站中一般都会有多个条件入口,用户可以选择一个或多个条件进行查询,那这个时候在请求时,我们不能确定所有的条件都是有值的,部分条件可能用户没有传值,那该条件就为null。
比如在电商网站中,可以选择多个查询条件。
编辑
那为null的条件,我们是不需要进行查询条件拼接的,否则就会出现如下情况,将为null的条件进行拼接,筛选后无法查询出结果
@Test void isNull(){ LambdaQueryWrapper lambdaQueryWrapper = new
LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(User::getName,null); User user = userMapper.selectOne(lambdaQueryWrapper); System.out.println(user); } |
编辑
当然我们要解决这个问题,可以先判断是否为空,根据判断结果选择是否拼接该字段,这个功能其实不需要我们写,由MybatisPlus的方法已经提供好了。
@Test void isNull2(){ LambdaQueryWrapper lambdaQueryWrapper =
new LambdaQueryWrapper<>(); String name = null; lambdaQueryWrapper.eq(name != null,User::getName,name); List users = userMapper.selectList(lambdaQueryWrapper); System.out.println(users); } |
3.32 allEq
先演示一下如何通过多个eq,构建多条件查询
@Test void allEq1(){ LambdaQueryWrapper lambdaQueryWrapper = new
LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(User::getName,"Jone"); lambdaQueryWrapper.eq(User::getAge,18); User user = userMapper.selectOne(lambdaQueryWrapper); System.out.println(user); } |
如果此时有多个条件需要同时判断,我们可以将这多个条件放入到Map集合中,更加的方便
@Test void allEq2(){ ** //1. **创建 QueryWrapper 对象 ****QueryWrapper queryWrapper = new QueryWrapper<>(); ** //2. **构建条件 Map
****HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put("name","Jone"); hashMap.put("age",null); ** //3. **使用条件完成查询 ****queryWrapper.allEq(hashMap,false); User user = userMapper.selectOne(queryWrapper); System.out.println(user); } |
allEq(Map<R, V> params, boolean null2IsNull)
参数params:表示传递的Map集合
参数null2IsNull:表示对于为null的条件是否判断isNull
3.33****ne
@Test void ne(){ ** //1. **创建 QueryWrapper 对象 ****LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); ** //2. **设置条件,指定 String 字段名称和值 ****String name = "Jone"; lambdaQueryWrapper.ne(User::getName,name); ** //3. **使用条件完成查询 ****List users = userMapper.selectList(lambdaQueryWrapper); System.out.println(users); } |
拼接的SQL如下
编辑