一、MyBatis-Plus 基础核心定义是 MyBatis 的增强工具只做增强不做改变简化开发、提高效率提供通用 Mapper/Service无需编写 SQL 即可实现单表 CRUD、批量、逻辑删除、分页等操作。核心特性无侵入、损耗小、强大 CRUD 操作、支持 Lambda 调用、主键自动生成、支持 ActiveRecord 模式、自定义全局通用操作、内置代码生成器 / 分页插件 / 性能分析插件 / 全局拦截插件等。支持数据库MySQL、Oracle、DB2、H2、PostgreSQL、SQLServer 等及达梦、人大金仓等国产数据库。官方地址官网http://mp.baomidou.com文档https://baomidou.com/pages/24112f代码托管在 Github/Gitee。开发环境要求IDEIDEA、JDK8、Maven3.5.4、MySQL5.7、SpringBoot2.6.3、MyBatis-Plus3.5.1。二、入门案例实现数据库准备创建数据库mybatis_plus建user表并插入测试数据包含id(bigint)、name(varchar)、age(int)、email(varchar)字段。工程搭建初始化 Spring Boot 工程引入核心依赖mybatis-plus-boot-starter、lombok、mysql-connector-java、spring-boot-starter-test。IDEA 安装 Lombok 插件解决注解编译问题。核心配置application.yml配置数据源HikariDataSource区分 SpringBoot2.0/2.1 的驱动类MySQL5.7/8.0 的 URL 格式。启动类添加MapperScan注解扫描 Mapper 接口包。代码编写实体类使用DataLombok简化 get/set 等方法。Mapper 接口继承 MyBatis-Plus 的BaseMapperT泛型接口无需编写方法。测试注入 Mapper调用selectList(null)查询所有数据null 表示无查询条件。日志配置在application.yml中配置 MyBatis 日志实现为org.apache.ibatis.logging.stdout.StdOutImpl打印执行的 SQL 语句。三、基本 CRUD 操作1. 基于 BaseMapperBaseMapperT内置单表 CRUD 所有方法核心方法如下插入insert(T entity)默认基于雪花算法生成主键 ID。删除deleteById(Serializable id)单 ID 删除、deleteBatchIds(Collection idList)批量 ID 删除、deleteByMap(Map columnMap)条件删除。修改updateById(T entity)根据 ID 修改非 null 字段才更新。查询selectById(Serializable id)单 ID 查询、selectBatchIds(Collection idList)批量 ID 查询、selectByMap(Map columnMap)条件查询、selectList(Wrapper wrapper)条件查询列表、selectCount(Wrapper wrapper)查询总数。2. 基于通用 ServiceMyBatis-Plus 封装IServiceT和实现类ServiceImplM extends BaseMapperT, T进一步封装 CRUD区分 Mapper 层命名如get查单行、remove删除、list查集合、page分页。步骤Service 接口继承IServiceT实现类继承ServiceImplMapper, 实体并实现自定义接口。核心方法count()查询总记录数、saveBatch(Collection entityList)批量插入解决 SQL 长度限制问题。四、常用注解1. TableName作用解决实体类名与数据库表名不一致的问题。使用在实体类上标注TableName(表名)如TableName(t_user)。全局配置在application.yml中配置mybatis-plus.global-config.db-config.table-prefix统一设置表前缀如t_无需每个实体单独标注。2. TableId作用标识实体类的主键属性解决主键字段名与实体属性名不一致、主键策略自定义问题。核心属性value指定数据库表的主键字段名如实体属性id对应表字段uid标注TableId(value uid)。type指定主键策略常用IdType.ASSIGN_ID默认雪花算法与数据库自增无关、IdType.AUTO数据库自增需保证表主键设置自增。全局主键策略在application.yml中配置mybatis-plus.global-config.db-config.id-type统一设置所有表的主键策略。雪花算法分布式主键生成算法64bit 长整型包含 1bit 符号位、41bit 时间戳、10bit 机器 ID、12bit 毫秒流水号保证分布式系统主键唯一且有序解决分表后的主键全局唯一问题。3. TableField作用解决实体属性名与数据库字段名不一致的问题。特殊情况实体驼峰命名如userName对应表下划线命名如user_nameMyBatis-Plus 自动转换无需标注非该规则需标注如实体name对应表username标注TableField(username)。4. TableLogic作用实现逻辑删除假删除修改删除状态而非物理删除数据适用于需要数据恢复的场景。实现步骤数据库表添加逻辑删除字段如is_deleted默认值 0 表示未删除。实体类添加对应属性标注TableLogic。调用删除方法时MyBatis-Plus 自动执行UPDATE修改删除状态如is_deleted1查询时自动过滤已删除数据WHERE is_deleted0。五、条件构造器和常用接口1. Wrapper 体系Wrapper 是条件构造抽象类核心子类 / 实现类AbstractWrapper查询条件封装生成 SQL 的 WHERE 子句。QueryWrapper普通查询条件构造器通过字符串指定字段名。UpdateWrapper更新条件构造器可同时封装 SET 子句和 WHERE 子句。LambdaQueryWrapper/LambdaUpdateWrapperLambda 版条件构造器通过实体方法引用指定字段User::getName避免字段名拼写错误推荐使用。2. 核心使用场景QueryWrapper组装查询条件like(字段, 值)、between(字段, 最小值, 最大值)、isNotNull(字段)。组装排序条件orderByDesc(字段)、orderByAsc(字段)。组装删除条件直接作为delete(Wrapper)的参数生成删除条件。条件优先级通过 lambda 表达式and(i - i.条件1().or().条件2())实现括号内的条件优先运算。组装 SELECT 子句select(字段1, 字段2)配合selectMaps()返回 Map 集合避免实体非查询字段为 null。子查询inSql(字段, 子查询SQL)。3. UpdateWrapper专门用于更新操作可通过set(字段, 值)手动设置 SET 子句无需创建实体对象适合只更新部分字段且带复杂条件的场景。4. Condition 条件判断针对用户可选条件如查询时用户名、年龄区间可能为 null通过带condition参数的重载方法判断条件是否成立成立则组装到 SQL 中简化 if-else 代码如like(StringUtils.isNotBlank(username), username, username)。5. Lambda 版 Wrapper 优势通过实体::getField指定字段编译期检查字段名避免运行时因字段名拼写错误导致的异常是开发中的推荐写法。六、核心插件1. 分页插件MyBatis-Plus 内置物理分页插件无需手动编写分页 SQL配置即可使用。配置创建配置类注入MybatisPlusInterceptor添加PaginationInnerInterceptor指定数据库类型如DbType.MYSQL。使用创建PageT(当前页, 每页条数)对象作为selectPage(Page, Wrapper)的参数分页结果封装在 Page 对象中包含数据列表、总记录数、总页数等。自定义 XML 分页Mapper 接口定义方法时将PageT作为第一个参数XML 中编写普通查询 SQLMyBatis-Plus 自动拼接分页条件。2. 乐观锁插件1核心概念乐观锁假设并发操作不会发生冲突更新时检查数据是否被修改若未修改则更新否则失败重试适合读多写少场景。悲观锁假设并发操作一定会发生冲突获取数据时直接加锁阻止其他操作适合写多读少场景。2实现步骤数据库表添加版本号字段如version默认值 0。实体类对应属性标注Version注解。配置类中向MybatisPlusInterceptor添加OptimisticLockerInnerInterceptor。原理查询时获取当前 version更新时执行UPDATE ... SET version version 1 WHERE ... AND version 原版本号版本号不匹配则更新失败。冲突处理更新失败时返回结果为 0重新查询数据获取最新 version再次执行更新操作重试机制。七、通用枚举用于处理数据库中固定值字段如性别、状态避免硬编码数字提高代码可读性。数据库表添加枚举字段如sexint 类型。创建枚举类添加属性使用EnumValue注解标注映射到数据库的属性如EnumValue private Integer sex;。配置扫描枚举在application.yml中设置mybatis-plus.type-enums-package为枚举类所在包。使用实体类直接设置枚举值如user.setSex(SexEnum.MALE)MyBatis-Plus 自动将EnumValue标注的属性值存入数据库。八、代码生成器MyBatis-Plus 内置代码生成器可快速生成 Entity、Mapper、Service、Controller 层代码支持自定义模板引擎。引入依赖mybatis-plus-generator 模板引擎如 Freemarker。快速生成使用FastAutoGenerator配置数据库连接、全局配置作者、输出目录、覆盖已生成文件、包配置父包名、模块名、策略配置需要生成的表名、过滤表前缀、模板引擎执行execute()即可生成代码。九、多数据源适用于纯粹多库、读写分离、一主多从等场景基于dynamic-datasource-spring-boot-starter实现。环境准备创建多个数据库分别存放不同表如mybatis_plus存 user 表mybatis_plus_1存 product 表。引入依赖dynamic-datasource-spring-boot-starter。配置多数据源在application.yml中配置spring.datasource.dynamic设置默认数据源primary、多个数据源master/slave_1的连接信息。指定数据源在 Service/ServiceImpl 类上标注DS(数据源名称)指定该类操作的数据源读写分离场景可在写方法标注主库、读方法标注从库。测试分别注入不同数据源的 Service调用方法可成功操作对应数据库的表。十、MyBatisX 插件作用基于 IDEA 的快速开发插件弥补 MyBatis-Plus 在复杂 SQL、多表联查的不足提高开发效率。核心优势支持 Mapper 接口与 XML 文件的快速跳转、自动生成 SQL 语句、参数提示、结果集映射等具体用法参考官方文档https://baomidou.com/pages/ba5b24/。