MyBatis-Plus 知识点整理
-
- [一、MyBatis-Plus 简介](#一、MyBatis-Plus 简介)
- 二、核心注解(实体类上使用)
- [三、BaseMapper 接口](#三、BaseMapper 接口)
- [四、IService & ServiceImpl(业务层)](#四、IService & ServiceImpl(业务层))
- [五、条件构造器 Wrapper(重点)](#五、条件构造器 Wrapper(重点))
-
- [✅ 一句话定义](#✅ 一句话定义)
- [✅ Wrapper 分类(继承结构)](#✅ Wrapper 分类(继承结构))
- [✅ 常用条件方法](#✅ 常用条件方法)
- [✅ 代码示例](#✅ 代码示例)
-
- [示例1:LambdaQueryWrapper 查询(推荐)](#示例1:LambdaQueryWrapper 查询(推荐))
- [示例2:LambdaUpdateWrapper 更新](#示例2:LambdaUpdateWrapper 更新)
- 示例3:QueryWrapper(不推荐,硬编码字符串)
- [✅ 重点知识点&坑点](#✅ 重点知识点&坑点)
- [✅ 适用场景](#✅ 适用场景)
- [✅ 面试背诵精简版](#✅ 面试背诵精简版)
- 六、分页插件(必须配置)
- 七、常用扩展功能
- [八、MyBatis 和 MyBatis-Plus 的区别](#八、MyBatis 和 MyBatis-Plus 的区别)
- 九、面试精简背诵版
一、MyBatis-Plus 简介
MyBatis-Plus(MP)是 MyBatis 的增强工具,只增强不修改,保留 MyBatis 原有全部功能。
核心作用:简化持久层开发,基础CRUD不用手写SQL、不用写XML
分层位置:持久层(DAO/Mapper层),负责数据库读写。
二、核心注解(实体类上使用)
-
@TableName("数据库表名")
@TableName("t_user")
public class User {}
- 作用:实体类与数据库表映射;类名和表名不一致时必须指定
-
@TableId
@TableId(type = IdType.AUTO)
private Long id;
- 作用:标记主键字段
- 主键策略:
type = IdType.AUTO自增、ASSIGN_ID雪花算法(默认)
- @TableField("数据库字段名")
- 作用:实体属性名和表字段名不一致时使用;
- 额外场景:字段不存在
@TableField(exist = false)
三、BaseMapper 接口
-
Mapper接口继承
BaseMapper<T>,自动内置全套基础CRUD方法,无需编写SQLpublic interface UserMapper extends BaseMapper
{}
✅ 内置常用方法:
insert():新增deleteById():根据id删除updateById():根据id修改selectById():根据id查询单条selectList():条件查询列表selectPage():分页查询
四、IService & ServiceImpl(业务层)
BaseMapper 是 Mapper层;IService 是 Service层封装
IService<T>:业务层接口继承ServiceImpl<M extends BaseMapper<T>, T>:业务层实现类继承>
Service层封装了更多便捷方法,批量新增/批量删除等。
//接口
public interface UserService extends IService<User>{}
//实现类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService<User>{}
五、条件构造器 Wrapper(重点)
✅ 一句话定义
Wrapper 是 MyBatis-Plus 的条件构造器 ,用来通过Java代码动态拼接SQL的WHERE条件,不用手写XML、不用拼接SQL字符串,链式调用构建查询/更新条件,自动生成预编译SQL,防止SQL注入。
作用场景:BaseMapper基础CRUD只能按ID操作;如果需要多条件、模糊查询、范围查询、动态更新,就用Wrapper。
✅ Wrapper 分类(继承结构)
- AbstractWrapper:抽象父类,封装所有条件方法(eq、gt、like、or、and等)
- QueryWrapper :普通查询条件构造器,用于
select查询,需要写字符串字段名 - UpdateWrapper :更新条件构造器,用于
update更新,可以set要修改的字段 + 拼接where条件 - LambdaQueryWrapper :Lambda版查询构造器【推荐 】,使用实体类方法引用
User::getName,不写字符串,避免字段名写错 - LambdaUpdateWrapper :Lambda版更新构造器【推荐】,Lambda方式构建更新条件
优先使用Lambda系列Wrapper,重构实体类属性时,编译器会直接报错,减少bug。
✅ 常用条件方法
| 方法 | 含义 | 对应SQL |
|---|---|---|
| eq | 等于 | name = '张三' |
| ne | 不等于 | age != 18 |
| gt | 大于 | age > 18 |
| ge | 大于等于 | age >=18 |
| lt | 小于 | age < 60 |
| le | 小于等于 | age <=60 |
| like | 模糊查询 | name LIKE '%张%' |
| likeLeft | 左模糊 | name LIKE '%张' |
| likeRight | 右模糊 | name LIKE '张%' |
| isNull | 字段为null | email IS NULL |
| isNotNull | 不为null | email IS NOT NULL |
| between | 区间 | age between 18 and 30 |
✅ 代码示例
示例1:LambdaQueryWrapper 查询(推荐)
// 查询:name="张三" 并且 age>18
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName,"张三").gt(User::getAge,18);
List<User> list = userMapper.selectList(wrapper);
示例2:LambdaUpdateWrapper 更新
// 将id=1的用户,名字修改为李四
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(User::getId,1L)
.set(User::getName,"李四");
userMapper.update(null, updateWrapper);
示例3:QueryWrapper(不推荐,硬编码字符串)
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","张三"); // 直接写字段字符串,容易拼写错误
✅ 重点知识点&坑点
-
链式调用默认是 and 关系 ;如果需要
or,要显式调用.or()// name=张三 OR age>18
wrapper.eq(User::getName,"张三").or().gt(User::getAge,18); -
条件可以动态生效 :
eq(boolean condition, 字段, 值),condition=false时该条件不会拼接进SQL,适合前端动态传参场景// name条件,只有name不为null才拼接
wrapper.eq(name != null, User::getName, name); -
注意 :使用
update(null, updateWrapper)这种写法更新,没有传入实体对象,乐观锁不会生效,详情参考我的另一篇博文:《乐观锁(MyBatis-Plus)》
✅ 适用场景
✅ 适合:多条件组合查询、模糊搜索、动态条件更新、列表筛选。
❌ 不适合:多表关联复杂SQL(复杂SQL还是写原生MyBatis XML)。
✅ 面试背诵精简版
Wrapper是MyBatis-Plus的条件构造器,用于Java代码动态拼接where条件,不用手写SQL字符串。主要分为QueryWrapper、UpdateWrapper,以及推荐使用的LambdaQueryWrapper、LambdaUpdateWrapper;Lambda方式使用实体方法引用,避免硬编码字段名,减少错误。支持eq、gt、like、or等条件,链式调用。
六、分页插件(必须配置)
MP分页需要注册分页插件,否则分页total总数不生效
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
使用:Page<User> page = new Page<>(页码,每页条数);
七、常用扩展功能
- 逻辑删除 :假删除,数据库加
deleted字段,删除操作变成更新,查询自动过滤已删除数据- 配置:
@TableLogic
- 配置:
- 自动填充 :创建时间、更新时间
createTime、updateTime,注解@TableField(fill = FieldFill.INSERT) - 乐观锁 :版本号
version,@Version,防止并发更新冲突 - 主键策略
- IdType.AUTO:数据库自增
- IdType.ASSIGN_ID:雪花算法(默认,分布式)
- IdType.INPUT:手动输入主键
八、MyBatis 和 MyBatis-Plus 的区别
- MyBatis:原生需要手写XML/注解SQL,基础增删改查都要写
- MyBatis-Plus:增强工具,基础CRUD自动生成;复杂SQL仍然可以使用MyBatis原生XML,两者共存
九、面试精简背诵版
MyBatis-Plus是MyBatis增强工具,只增强不改变。核心简化持久层开发,基础CRUD不用写SQL。
实体类用@TableName映射表、@TableId标记主键、@TableField映射普通字段。Mapper继承BaseMapper自带CRUD。
Wrapper条件构造器用来拼接查询条件,推荐LambdaWrapper避免硬编码字段。分页需要配置分页插件。
还提供逻辑删除、自动填充、乐观锁等功能,复杂SQL依然可以使用原生MyBatis XML。