MyBatis-Plus 知识点整理

MyBatis-Plus 知识点整理

    • [一、MyBatis-Plus 简介](#一、MyBatis-Plus 简介)
    • 二、核心注解(实体类上使用)
    • [三、BaseMapper 接口](#三、BaseMapper 接口)
    • [四、IService & ServiceImpl(业务层)](#四、IService & ServiceImpl(业务层))
    • [五、条件构造器 Wrapper(重点)](#五、条件构造器 Wrapper(重点))
      • [✅ 一句话定义](#✅ 一句话定义)
      • [✅ Wrapper 分类(继承结构)](#✅ Wrapper 分类(继承结构))
      • [✅ 常用条件方法](#✅ 常用条件方法)
      • [✅ 代码示例](#✅ 代码示例)
      • [✅ 重点知识点&坑点](#✅ 重点知识点&坑点)
      • [✅ 适用场景](#✅ 适用场景)
      • [✅ 面试背诵精简版](#✅ 面试背诵精简版)
    • 六、分页插件(必须配置)
    • 七、常用扩展功能
    • [八、MyBatis 和 MyBatis-Plus 的区别](#八、MyBatis 和 MyBatis-Plus 的区别)
    • 九、面试精简背诵版

一、MyBatis-Plus 简介

MyBatis-Plus(MP)是 MyBatis 的增强工具,只增强不修改,保留 MyBatis 原有全部功能。

核心作用:简化持久层开发,基础CRUD不用手写SQL、不用写XML

分层位置:持久层(DAO/Mapper层),负责数据库读写。

二、核心注解(实体类上使用)

  1. @TableName("数据库表名")

    @TableName("t_user")
    public class User {}

  • 作用:实体类与数据库表映射;类名和表名不一致时必须指定
  1. @TableId

    @TableId(type = IdType.AUTO)
    private Long id;

  • 作用:标记主键字段
  • 主键策略:type = IdType.AUTO 自增、ASSIGN_ID 雪花算法(默认)
  1. @TableField("数据库字段名")
    • 作用:实体属性名和表字段名不一致时使用;
    • 额外场景:字段不存在 @TableField(exist = false)

三、BaseMapper 接口

  • Mapper接口继承 BaseMapper<T>,自动内置全套基础CRUD方法,无需编写SQL

    public interface UserMapper extends BaseMapper{}

✅ 内置常用方法:

  • insert():新增
  • deleteById():根据id删除
  • updateById():根据id修改
  • selectById():根据id查询单条
  • selectList():条件查询列表
  • selectPage():分页查询

四、IService & ServiceImpl(业务层)

BaseMapper 是 Mapper层;IService 是 Service层封装

  1. IService<T>:业务层接口继承
  2. 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 分类(继承结构)

  1. AbstractWrapper:抽象父类,封装所有条件方法(eq、gt、like、or、and等)
  2. QueryWrapper :普通查询条件构造器,用于select查询,需要写字符串字段名
  3. UpdateWrapper :更新条件构造器,用于update更新,可以set要修改的字段 + 拼接where条件
  4. LambdaQueryWrapper :Lambda版查询构造器【推荐 】,使用实体类方法引用User::getName,不写字符串,避免字段名写错
  5. 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","张三"); // 直接写字段字符串,容易拼写错误

✅ 重点知识点&坑点

  1. 链式调用默认是 and 关系 ;如果需要or,要显式调用.or()

    // name=张三 OR age>18
    wrapper.eq(User::getName,"张三").or().gt(User::getAge,18);

  2. 条件可以动态生效 :eq(boolean condition, 字段, 值),condition=false时该条件不会拼接进SQL,适合前端动态传参场景

    // name条件,只有name不为null才拼接
    wrapper.eq(name != null, User::getName, name);

  3. 注意 :使用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<>(页码,每页条数);

七、常用扩展功能

  1. 逻辑删除 :假删除,数据库加deleted字段,删除操作变成更新,查询自动过滤已删除数据
    • 配置:@TableLogic
  2. 自动填充 :创建时间、更新时间 createTime、updateTime,注解@TableField(fill = FieldFill.INSERT)
  3. 乐观锁 :版本号 version,@Version,防止并发更新冲突
  4. 主键策略
    • IdType.AUTO:数据库自增
    • IdType.ASSIGN_ID:雪花算法(默认,分布式)
    • IdType.INPUT:手动输入主键

八、MyBatis 和 MyBatis-Plus 的区别

  1. MyBatis:原生需要手写XML/注解SQL,基础增删改查都要写
  2. MyBatis-Plus:增强工具,基础CRUD自动生成;复杂SQL仍然可以使用MyBatis原生XML,两者共存

九、面试精简背诵版

MyBatis-Plus是MyBatis增强工具,只增强不改变。核心简化持久层开发,基础CRUD不用写SQL。

实体类用@TableName映射表、@TableId标记主键、@TableField映射普通字段。Mapper继承BaseMapper自带CRUD。

Wrapper条件构造器用来拼接查询条件,推荐LambdaWrapper避免硬编码字段。分页需要配置分页插件。

还提供逻辑删除、自动填充、乐观锁等功能,复杂SQL依然可以使用原生MyBatis XML。

相关推荐
豆角焖肉24 天前
MyBatis-Plus 从入门到 CRUD 实战:Spring Boot 整合
mybatis-plus
振宇i3 个月前
springcloudAlibaba2025.0.0.0组件版本对应关系
springcloud·mybatis-plus·依赖关系
skywalker_114 个月前
SpringBoot速通(实战教学)
java·spring boot·redis·rpc·ssm·mybatis-plus
段ヤシ.5 个月前
回顾Java知识点,面试题汇总Day17(持续更新)
java·springboot·spring security·shiro·mybatis-plus·jdbctemplate·spring data jpa
Mahir085 个月前
MyBatis 分页与插件深度解密:从插件机制到三大分页方案原理全解
java·后端·mybatis·mybatis-plus·大厂面试题
谷哥的小弟5 个月前
图文详解Spring Boot整合MyBatisPlus(附源码)
mybatis·源码·springboot·mybatis-plus·整合
递归尽头是星辰6 个月前
Java类型安全查询框架体系:QueryDSL、Ebean、jOOQ、MyBatis-Plus
mybatis-plus·querydsl·ebean·jooq·动态 sql
稻草猫.7 个月前
MyBatis-Plus高效开发全攻略
java·数据库·后端·spring·java-ee·mybatis·mybatis-plus
为美好的生活献上中指7 个月前
*Java 沉淀重走长征路*之——《MyBatis与MyBatis-Plus一文打尽!》
java·jvm·maven·mybatis·mybatis-plus