【MyBatis-Plus】MyBatis-Plus的核心特性、条件构造器、分页插件、乐观锁插件

简介: MyBatis-Plus 是 MyBatis 的无侵入增强工具,简化开发:内置通用 Mapper 实现单表 CRUD;支持 Lambda 条件构造器、分页、逻辑删除、乐观锁、多租户等插件;提供代码生成器与丰富主键策略,性能接近原生,广受国内开发者青睐。

MyBatis-Plus

一、MyBatis-Plus 概述

1. 定义与定位

MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,在 MyBatis 基础上只做增强不做改变,致力于简化开发、提升效率,是国内最流行的 MyBatis 扩展框架之一。

2. 核心优势

  • 无侵入:不改变现有代码结构,引入即可使用。
  • 损耗小:启动即自动注入基础 CRUD,性能接近原生 MyBatis。
  • 强大 CRUD:内置通用 Mapper,少量配置即可实现单表 80% 以上的 CRUD 操作。
  • Lambda 调用:支持 Lambda 表达式,避免字段名拼写错误。
  • 丰富插件:内置分页、乐观锁、逻辑删除、多租户等实用插件。
  • 代码生成:一键生成 Entity、Mapper、Service、Controller 等代码。

二、核心基础功能

1. 通用 Mapper(BaseMapper)

Mapper 接口继承 BaseMapper<T>,即可自动拥有单表的 CRUD 能力,无需编写 XML 或 SQL。

核心方法

  • 插入insert(T entity)insertBatchSomeColumn(List<T> entityList)
  • 删除deleteById(Serializable id)delete(Wrapper<T> wrapper)
  • 更新updateById(T entity)update(T entity, Wrapper<T> updateWrapper)
  • 查询selectById(Serializable id)selectList(Wrapper<T> queryWrapper)selectPage(Page<T> page, Wrapper<T> queryWrapper)

2. 条件构造器(Wrapper)

用于构建 SQL 查询条件,替代手写 SQL 的 WHERE 子句,类型安全且灵活。

核心实现类

  • QueryWrapper:查询条件构造器,用于 SELECT、DELETE、UPDATE。
  • UpdateWrapper:更新条件构造器,可设置 SET 字段。
  • LambdaQueryWrapper:Lambda 形式的查询构造器,通过方法引用(如 User::getName)避免字段名错误。
  • LambdaUpdateWrapper:Lambda 形式的更新构造器。

常用方法

  • 等值:eq(等于)、ne(不等于)
  • 范围:gt(大于)、lt(小于)、between(在...之间)
  • 模糊:like(包含)、likeLeft(左模糊)、likeRight(右模糊)
  • 排序:orderByAsc(升序)、orderByDesc(降序)
  • 逻辑:andornested(嵌套条件)

3. 分页插件

基于 MyBatis 物理分页,支持多种数据库(MySQL、Oracle 等)。

使用步骤

  1. 注册插件:在配置类中注册 PaginationInnerInterceptor,指定数据库类型。
  2. 调用方法:创建 Page<T> 对象(传入当前页、每页大小),调用 selectPage 方法。

示例

Page<User> page = new Page<>(1, 10);
Page<User> result = userMapper.selectPage(page, new LambdaQueryWrapper<User>().eq(User::getAge, 18));

4. 代码生成器

根据数据库表结构,一键生成 Entity、Mapper、Service、Controller 等代码,支持自定义模板。

核心组件

  • FastAutoGenerator(新版推荐):通过链式调用配置数据源、包路径、策略等。

三、扩展增强功能

1. 逻辑删除

并非真正删除数据,而是通过字段(如 deleted)标记为“已删除”,查询时自动过滤。

实现步骤

  1. 数据库表添加 deleted 字段(TINYINT 类型,0 未删除,1 已删除)。
  2. 实体类字段添加 @TableLogic 注解。
  3. 全局配置(可选):
    mybatis-plus:
      global-config:
        db-config:
          logic-delete-field: deleted
          logic-delete-value: 1
          logic-not-delete-value: 0
    

2. 乐观锁

通过版本号(version)控制并发,更新时检查版本号是否一致,一致则更新并递增版本号。

实现步骤

  1. 数据库表添加 version 字段(INT 类型,默认值 1)。
  2. 实体类字段添加 @Version 注解。
  3. 注册 OptimisticLockerInnerInterceptor 插件。

3. ActiveRecord 模式

实体类继承 Model<T>,即可直接调用实体类方法进行 CRUD,无需注入 Mapper。

示例

User user = new User();
user.setName("张三");
user.insert(); // 直接插入
User result = new User().selectById(1); // 直接查询

四、高级特性

1. 多租户支持

通过租户 ID(如 tenant_id)实现不同租户的数据隔离。

实现步骤

  1. 实现 TenantLineHandler 接口,重写 getTenantId()(获取当前租户 ID)、ignoreTable()(指定忽略的表)。
  2. 注册 TenantLineInnerInterceptor 插件。

2. 动态表名

运行时动态修改表名,适用于分表场景(如 user_2024user_2025)。

实现步骤

  1. 实现 TableNameHandler 接口,重写 dynamicTableName()(根据原表名返回动态表名)。
  2. 注册 DynamicTableNameInnerInterceptor 插件。

3. 主键生成策略

通过 @TableId 注解的 type 属性指定主键生成方式:

  • IdType.ASSIGN_ID(默认):雪花算法生成 Long 类型主键(分布式场景)。
  • IdType.AUTO:数据库自增主键。
  • IdType.INPUT:用户手动输入主键。
  • IdType.ASSIGN_UUID:生成 UUID 作为主键。

五、Spring Boot 集成与配置

1. 依赖引入

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>

2. 基础配置(application.yml)

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis_plus_demo?serverTimezone=Asia/Shanghai
    username: root
    password: 123456

mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  type-aliases-package: com.example.demo.entity
  configuration:
    map-underscore-to-camel-case: true # 下划线转驼峰
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # SQL 日志

3. 插件注册

@Configuration
public class MybatisPlusConfig {
   
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
   
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 分页
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 乐观锁
        return interceptor;
    }
}

六、最佳实践与常见问题

1. 最佳实践

  • 分层架构:Controller → Service → Mapper,Service 处理业务逻辑,Mapper 仅负责数据库操作。
  • Lambda Wrapper 优先:使用 LambdaQueryWrapper 避免字段名错误。
  • 代码生成器定制:根据项目规范定制模板,添加 Swagger 注解、统一返回结果等。
  • SQL 日志开启:开发环境开启 SQL 日志,便于调试。

2. 常见问题

  • 分页不生效:检查是否注册 PaginationInnerInterceptor,且数据库类型(DbType)正确。
  • 逻辑删除未生效:检查实体类是否添加 @TableLogic 注解,全局配置是否正确。
  • 乐观锁未生效:检查是否注册 OptimisticLockerInnerInterceptor,更新时是否传入 version 字段。
相关文章
|
16天前
|
SQL Java 数据库
【MyBatis-Plus】Spring Boot + MyBatis-Plus 进行各种数据库操作(附完整 CRUD 项目代码示例)
本文详解Spring Boot集成MyBatis-Plus全流程:从依赖引入、数据源配置、Mapper扫描到分页/乐观锁/逻辑删除等核心插件配置;涵盖BaseMapper基础CRUD、LambdaQueryWrapper条件查询、Service层封装、自定义XML多表关联及批量优化实践,附完整可运行示例。
|
14天前
|
存储 前端开发 数据库
【VO、DTO、Entity】VO、DTO、Entity三大核心数据对象全解析(附核心对比表 + 代码示例)
本文系统解析VO、DTO、Entity三大核心数据对象,涵盖其在分层架构、DDD与微服务中的定位、职责边界、设计规范及全链路流转规则,辅以对比表、代码示例与避坑指南,助你构建高内聚、低耦合、安全可维护的企业级数据模型体系。
【VO、DTO、Entity】VO、DTO、Entity三大核心数据对象全解析(附核心对比表 + 代码示例)
|
存储
(pinia-plugin-persistedstate)pinia 持久化存储
(pinia-plugin-persistedstate)pinia 持久化存储
1568 1
|
12天前
|
人工智能 Java iOS开发
【IDEA】IntelliJ IDEA 最新、最全快捷键指南(Windows + MacOS 完整版)
本指南整理IntelliJ IDEA 2024.3.7与2025.1.7双版本快捷键,覆盖Windows/macOS双平台,涵盖编辑、导航、调试、重构、Git、AI编码等17大类共300+高频快捷键,并附分层学习建议与2025.3统一版更新说明,助开发者高效进阶。
|
22天前
|
存储 IDE Java
【Maven】如何创建/导入Maven项目?手把手教学(包括下载/安装/创建/配置)
Maven是Java项目管理与构建工具,核心功能包括:依赖管理(自动下载jar包、解决版本冲突)、标准化构建(编译、测试、打包、部署)和统一项目结构(跨IDE兼容)。通过pom.xml配置,结合中央仓库与阿里云镜像,大幅提升开发效率。
|
2月前
|
安全 Java API
Spring Boot 4 升级实战:从3.x到4.0的分步升级保姆级指南
Spring Boot 4.0于2025年11月发布,基于Spring Framework 7.0,实现模块化(47个轻量自动配置)、JSpecify空安全校验、原生API版本控制等重大升级。镜像减19%、启动快33%,迁移平滑,3.5.x支持至2026年11月。(239字)
|
8天前
|
安全 NoSQL Java
基于JWT+SpringSecurity整合一个单点认证授权机制
本文介绍了基于JWT和SpringSecurity的授权认证机制架构设计。系统采用RBAC权限模型,通过5张表描述用户-角色-权限关系。认证流程包含登录验证、IP检查、密码匹配等环节,使用JWT生成token并保存用户信息到Redis。授权部分利用@PreAuthorize注解和PermissionService实现权限校验,支持单权限、多权限及角色验证。整体架构通过过滤器链实现无状态认证,兼顾安全性和灵活性,为开发者提供了完整的认证授权解决方案。
|
SQL 机器学习/深度学习 XML
mybatis-plus分页查询详解
mybatis-plus分页查询详解
11554 0
mybatis-plus分页查询详解
|
Java 数据库连接 mybatis
在Spring Boot应用中集成MyBatis与MyBatis-Plus
在Spring Boot应用中集成MyBatis与MyBatis-Plus
750 5
|
设计模式 开发框架 前端开发
VO、PO、DTO的区别
VO、PO、DTO的区别
1443 3