
一、MyBatis-Plus 核心优势无侵入只增强 MyBatis 功能原有 MyBatis 代码不受任何影响平滑迁移内置通用 MapperBaseMapper 封装单表增删改查无需写 XML强大条件构造器Wrapper 自动拼接动态 SQL不用拼接字符串内置分页插件一行代码实现分页支持多数据库逻辑删除、乐观锁、主键策略开箱即用代码生成器一键生成 Entity、Mapper、Service、Controller 全套代码支持多种数据库MySQL、Oracle、PostgreSQL、SQLServer 等主流数据库。二、SpringBoot 整合 MyBatis-Plus2.1 Maven 依赖引入xml!-- SpringBoot 父工程自行引入 -- !-- MyBatis-Plus 启动器 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency !-- MySQL驱动 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency !-- 数据库连接池 HikariCP(SpringBoot默认) -- !-- lombok简化实体类get/set -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency2.2 application.yml 配置文件yaml# 数据库配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test_db?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai username: root password: 你的数据库密码 # MyBatis-Plus配置 mybatis-plus: # 实体类别名包路径 type-aliases-package: com.example.mp.entity # mapper映射文件位置 mapper-locations: classpath:mapper/*.xml configuration: # 开启SQL打印日志开发调试必备 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启驼峰命名自动转换数据库user_name → 实体userName map-underscore-to-camel-case: true global-config: db-config: # 主键自增策略 id-type: auto # 逻辑删除字段名 logic-delete-field: isDeleted logic-delete-value: 1 # 删除值 logic-not-delete-value: 0 # 未删除值2.3 启动类添加 Mapper 扫描注解import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication // 扫描mapper接口所在包 MapperScan(com.example.mp.mapper) public class MpApplication { public static void main(String[] args) { SpringApplication.run(MpApplication.class, args); } }三、实体类、Mapper、Service 基础结构3.1 数据库表设计user 表CREATE TABLE user ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主键, user_name varchar(30) DEFAULT NULL COMMENT 用户名, age int DEFAULT NULL COMMENT 年龄, email varchar(50) DEFAULT NULL COMMENT 邮箱, version int DEFAULT 1 COMMENT 乐观锁版本号, is_deleted tinyint DEFAULT 0 COMMENT 逻辑删除 0未删 1已删, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;3.2 实体类 User.java使用 MP 注解映射表、字段Lombok 简化代码package com.example.mp.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; Data TableName(user) // 映射数据库user表 public class User { // 主键自增 TableId(type IdType.AUTO) private Long id; TableField(user_name) private String userName; private Integer age; private String email; // 乐观锁版本字段 Version private Integer version; // 逻辑删除字段 TableLogic private Integer isDeleted; }3.3 Mapper 接口核心 BaseMapper继承BaseMapperT自动获得单表所有 CRUD 方法无需写 XMLpackage com.example.mp.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.mp.entity.User; import org.apache.ibatis.annotations.Mapper; Mapper public interface UserMapper extends BaseMapperUser { // 内置方法insert、deleteById、updateById、selectById、selectList等 }3.4 Service 层可选封装业务MP 提供ServiceImpl实现类封装批量操作、分页查询// Service接口 public interface UserService extends IServiceUser { } // Service实现类 Service public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService { }四、内置通用 CRUD 操作BaseMapper4.1 新增 insertAutowired private UserMapper userMapper; Test void testInsert(){ User user new User(); user.setUserName(张三); user.setAge(20); user.setEmail(zhangsan163.com); // 返回受影响行数自动回填自增id int rows userMapper.insert(user); System.out.println(新增行数rows); System.out.println(自增主键iduser.getId()); }4.2 根据 id 查询 selectByIdUser user userMapper.selectById(1L); System.out.println(user);4.3 根据 id 更新 updateById只更新实体中非 null 字段不会覆盖原有数据User updateUser new User(); updateUser.setId(1L); updateUser.setAge(22); userMapper.updateById(updateUser);4.4 根据 id 删除 deleteByIduserMapper.deleteById(1L);4.5 批量操作IService 提供Autowired private UserService userService; // 批量新增 ListUser batchList new ArrayList(); userService.saveBatch(batchList); // 批量删除 userService.removeByIds(Arrays.asList(1L,2L,3L));五、条件构造器 Wrapper5.1 QueryWrapper 条件查询// 查询年龄大于18名字包含张按id降序 QueryWrapperUser wrapper new QueryWrapper(); wrapper.gt(age, 18) .like(user_name, 张) .orderByDesc(id); ListUser list userMapper.selectList(wrapper);5.2 LambdaQueryWrapperLambdaQueryWrapperUser lambdaWrapper new LambdaQueryWrapper(); lambdaWrapper.gt(User::getAge, 18) .like(User::getUserName, 张) .orderByDesc(User::getId); ListUser list userMapper.selectList(lambdaWrapper);5.3 UpdateWrapper 条件更新UpdateWrapperUser updateWrapper new UpdateWrapper(); updateWrapper.eq(age,20) .set(email, updateqq.com); userMapper.update(null, updateWrapper);六、分页插件配置与分页查询6.1 分页插件配置类package com.example.mp.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class MyBatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 添加分页插件指定数据库类型MySQL interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }6.2 分页查询代码// 参数1当前页参数2每页条数 PageUser page new Page(1,5); LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); // page接收分页结果自动封装总条数、总页数、当前页数据 PageUser resultPage userMapper.selectPage(page, wrapper); System.out.println(总记录数resultPage.getTotal()); System.out.println(当前页数据resultPage.getRecords());七、高级功能7.1 逻辑删除配置文件已开启全局逻辑删除调用deleteById不会真实删除数据自动执行update set is_deleted1查询时自动过滤已删除数据。// 逻辑删除底层执行update语句 userMapper.deleteById(1L);7.2 乐观锁解决并发更新丢失场景多线程同时修改同一条数据避免覆盖更新通过 version 版本号实现。实体添加Version注解配置类添加乐观锁插件MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 乐观锁插件 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());更新逻辑更新时校验 version匹配成功 version1失败更新行数为 0User user userMapper.selectById(1L); user.setAge(30); userMapper.updateById(user);八、MyBatis-Plus 代码生成器生成器依赖xmldependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-generator/artifactId version3.5.3.1/version /dependency dependency groupIdorg.freemarker/groupId artifactIdfreemarker/artifactId /dependency生成器测试类import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import java.util.Collections; public class CodeGenerator { public static void main(String[] args) { FastAutoGenerator.create(jdbc:mysql://localhost:3306/test_db?serverTimezoneAsia/Shanghai, root, 数据库密码) .globalConfig(builder - { builder.author(作者名) // 设置作者 .outputDir(System.getProperty(user.dir) /src/main/java); // 输出路径 }) .packageConfig(builder - { builder.parent(com.example.mp) // 父包名 .moduleName() // 模块名 .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty(user.dir) /src/main/resources/mapper)); }) .strategyConfig(builder - { builder.addInclude(user) // 要生成的表名 .entityBuilder() .enableLombok() // 开启lombok .tableAnnotateEnable(true); // 开启表注解 }) .execute(); } }九、总结分页查询 total 为 0忘记配置PaginationInnerInterceptor分页插件LambdaWrapper 报字段不存在实体字段和数据库映射错误检查TableField逻辑删除不生效yml 未配置 logic-delete 相关参数实体缺少TableLogic乐观锁更新失效未添加乐观锁插件、更新时没有携带 version 字段SQL 驼峰转换失效yml 关闭了map-underscore-to-camel-caseMapper 注入报错启动类缺少MapperScan注解或包路径写错。MyBatis-Plus 简化了 MyBatis 重复 CRUD 开发核心使用流程引入 MP 依赖配置数据库与 MP 参数实体类使用注解映射数据表Mapper 继承 BaseMapper 获得通用 CRUDLambdaWrapper 构造动态查询条件分页、逻辑删除、乐观锁按需开启插件代码生成器一键生成全套业务代码。原生 MyBatis 复杂多表联查仍可以自定义 XMLMP 完全兼容兼顾简单单表快速开发和复杂 SQL 自定义需求。