【MyBatis-Plus】MyBatis-Plus的核心特性、条件构造器、分页插件、乐观锁插件
文章目录MyBatis-Plus一、MyBatis-Plus 概述1. 定义与定位2. 核心优势二、核心基础功能1. 通用 MapperBaseMapper2. 条件构造器Wrapper3. 分页插件4. 代码生成器三、扩展增强功能1. 逻辑删除2. 乐观锁3. ActiveRecord 模式四、高级特性1. 多租户支持2. 动态表名3. 主键生成策略五、Spring Boot 集成与配置1. 依赖引入2. 基础配置application.yml3. 插件注册六、最佳实践与常见问题1. 最佳实践2. 常见问题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. 通用 MapperBaseMapperMapper 接口继承BaseMapperT即可自动拥有单表的 CRUD 能力无需编写 XML 或 SQL。核心方法插入insert(T entity)、insertBatchSomeColumn(ListT entityList)删除deleteById(Serializable id)、delete(WrapperT wrapper)更新updateById(T entity)、update(T entity, WrapperT updateWrapper)查询selectById(Serializable id)、selectList(WrapperT queryWrapper)、selectPage(PageT page, WrapperT queryWrapper)2. 条件构造器Wrapper用于构建 SQL 查询条件替代手写 SQL 的 WHERE 子句类型安全且灵活。核心实现类QueryWrapper查询条件构造器用于 SELECT、DELETE、UPDATE。UpdateWrapper更新条件构造器可设置 SET 字段。LambdaQueryWrapperLambda 形式的查询构造器通过方法引用如User::getName避免字段名错误。LambdaUpdateWrapperLambda 形式的更新构造器。常用方法等值eq等于、ne不等于范围gt大于、lt小于、between在…之间模糊like包含、likeLeft左模糊、likeRight右模糊排序orderByAsc升序、orderByDesc降序逻辑and、or、nested嵌套条件3. 分页插件基于 MyBatis 物理分页支持多种数据库MySQL、Oracle 等。使用步骤注册插件在配置类中注册PaginationInnerInterceptor指定数据库类型。调用方法创建PageT对象传入当前页、每页大小调用selectPage方法。示例PageUserpagenewPage(1,10);PageUserresultuserMapper.selectPage(page,newLambdaQueryWrapperUser().eq(User::getAge,18));4. 代码生成器根据数据库表结构一键生成 Entity、Mapper、Service、Controller 等代码支持自定义模板。核心组件FastAutoGenerator新版推荐通过链式调用配置数据源、包路径、策略等。三、扩展增强功能1. 逻辑删除并非真正删除数据而是通过字段如deleted标记为“已删除”查询时自动过滤。实现步骤数据库表添加deleted字段TINYINT 类型0 未删除1 已删除。实体类字段添加TableLogic注解。全局配置可选mybatis-plus:global-config:db-config:logic-delete-field:deletedlogic-delete-value:1logic-not-delete-value:02. 乐观锁通过版本号version控制并发更新时检查版本号是否一致一致则更新并递增版本号。实现步骤数据库表添加version字段INT 类型默认值 1。实体类字段添加Version注解。注册OptimisticLockerInnerInterceptor插件。3. ActiveRecord 模式实体类继承ModelT即可直接调用实体类方法进行 CRUD无需注入 Mapper。示例UserusernewUser();user.setName(张三);user.insert();// 直接插入UserresultnewUser().selectById(1);// 直接查询四、高级特性1. 多租户支持通过租户 ID如tenant_id实现不同租户的数据隔离。实现步骤实现TenantLineHandler接口重写getTenantId()获取当前租户 ID、ignoreTable()指定忽略的表。注册TenantLineInnerInterceptor插件。2. 动态表名运行时动态修改表名适用于分表场景如user_2024、user_2025。实现步骤实现TableNameHandler接口重写dynamicTableName()根据原表名返回动态表名。注册DynamicTableNameInnerInterceptor插件。3. 主键生成策略通过TableId注解的type属性指定主键生成方式IdType.ASSIGN_ID默认雪花算法生成 Long 类型主键分布式场景。IdType.AUTO数据库自增主键。IdType.INPUT用户手动输入主键。IdType.ASSIGN_UUID生成 UUID 作为主键。五、Spring Boot 集成与配置1. 依赖引入dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion最新版本/version/dependency2. 基础配置application.ymlspring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/mybatis_plus_demo?serverTimezoneAsia/Shanghaiusername:rootpassword:123456mybatis-plus:mapper-locations:classpath*:/mapper/**/*.xmltype-aliases-package:com.example.demo.entityconfiguration:map-underscore-to-camel-case:true# 下划线转驼峰log-impl:org.apache.ibatis.logging.stdout.StdOutImpl# SQL 日志3. 插件注册ConfigurationpublicclassMybatisPlusConfig{BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptornewMybatisPlusInterceptor();interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));// 分页interceptor.addInnerInterceptor(newOptimisticLockerInnerInterceptor());// 乐观锁returninterceptor;}}六、最佳实践与常见问题1. 最佳实践分层架构Controller → Service → MapperService 处理业务逻辑Mapper 仅负责数据库操作。Lambda Wrapper 优先使用LambdaQueryWrapper避免字段名错误。代码生成器定制根据项目规范定制模板添加 Swagger 注解、统一返回结果等。SQL 日志开启开发环境开启 SQL 日志便于调试。2. 常见问题分页不生效检查是否注册PaginationInnerInterceptor且数据库类型DbType正确。逻辑删除未生效检查实体类是否添加TableLogic注解全局配置是否正确。乐观锁未生效检查是否注册OptimisticLockerInnerInterceptor更新时是否传入version字段。