当前位置: 首页 > news >正文

MyBatis-Plus:从入门到进阶

📌 摘要

在现代 Java 开发中,MyBatis-Plus 是基于 MyBatis 的增强工具,它在不改变 MyBatis 原有功能的基础上,提供了大量便捷的封装和扩展能力,极大提升了开发效率。

本文将带你从 MyBatis-Plus 基础语法高级特性 全面掌握这一高效 ORM 工具,内容涵盖:

  • MyBatis-Plus 简介与核心优势
  • 快速入门示例(Spring Boot 整合)
  • 核心功能详解(CRUD、QueryWrapper、LambdaQueryWrapper、自动分页等)
  • 高级特性(逻辑删除、乐观锁、多租户支持)
  • 实战案例解析
  • 性能优化建议与最佳实践
  • 常见面试题解析

适合初学者入门和中高级开发者提升技能。


🎯 一、为什么选择 MyBatis-Plus?

✅ MyBatis-Plus 的特点:

特性描述
简化 CRUD提供通用 Mapper 和 Service,减少重复代码
条件构造器强大的 QueryWrapper、LambdaQueryWrapper 构建查询条件
自动分页内置分页插件,一行代码实现分页
多租户支持支持企业级多租户架构
逻辑删除替代物理删除,软删除机制
乐观锁支持版本控制,避免并发冲突
代码生成器快速生成 Entity、Mapper、Service、Controller 等代码
无侵入性不影响原有 MyBatis 使用方式

❗ 适用场景:

  • 对开发效率要求高,希望快速搭建模块
  • 数据结构清晰、表字段命名规范
  • 不想重复编写基础 CURD 方法
  • 希望使用 Lambda 表达式构建查询条件
  • 需要内置分页、逻辑删除等功能的企业项目

🧱 二、MyBatis-Plus 核心组件介绍

组件描述
BaseMapper<T>提供通用的 CRUD 接口
IService<T> / ServiceImpl<M,T>封装业务逻辑接口和服务类
QueryWrapper<T>条件构造器,用于构建 SQL 查询条件
LambdaQueryWrapper<T>类型安全的 Lambda 表达式构建查询条件
Page<T>分页对象,配合分页插件使用
@TableName实体类与表名映射注解
@TableId主键注解,指定主键类型和字段
@TableLogic标记该字段为逻辑删除字段
@Version标记该字段为乐观锁版本号字段
AutoGenerator代码自动生成器,一键生成 Entity、Mapper、Service、Controller 等代码

🚀 三、快速入门:整合 Spring Boot + MyBatis-Plus

✅ 开发环境准备:

  • JDK 1.8+
  • Maven 3.x
  • MySQL 5.7+
  • Spring Boot 2.6+ 或 3.x(兼容)
  • IDE(如 IntelliJ IDEA)

1. 添加依赖(Maven):

<!-- Spring Boot Starter -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency><!-- MySQL驱动 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version>
</dependency><!-- MyBatis-Plus Starter -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3</version>
</dependency>

2. 配置 application.yml

spring:datasource:url: jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTCusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:mapper-locations: classpath:mapper/**/*.xmlconfiguration:mapUnderscoreToCamelCase: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3. 编写实体类 User.java

import com.baomidou.mybatisplus.annotation.*;@Data
@TableName("users")
public class User {@TableId(value = "id", type = IdType.AUTO)private Long id;private String name;private String email;@TableLogicprivate Integer deleted; // 逻辑删除字段@Versionprivate Integer version; // 乐观锁字段
}

4. Mapper 接口 UserMapper.java

import com.baomidou.mybatisplus.core.mapper.BaseMapper;public interface UserMapper extends BaseMapper<User> {
}

5. Service 层 UserService.java

import com.baomidou.mybatisplus.extension.service.IService;public interface UserService extends IService<User> {
}
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

6. 控制器层 UserController.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic List<User> getAllUsers() {return userService.list();}@PostMappingpublic boolean createUser(@RequestBody User user) {return userService.save(user);}
}

🛠️ 四、MyBatis-Plus 进阶功能详解

1. QueryWrapper 构建查询条件

List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("name", "Alice").ge("age", 18));

2. LambdaQueryWrapper(更安全、更直观)

List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().like(User::getName, "Tom").lt(User::getAge, 30));

3. 分页查询(配置分页插件)

启用分页插件:
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}
使用分页:
Page<User> page = new Page<>(1, 10); // 第一页,每页10条
IPage<User> userPage = userService.page(page);
System.out.println("总页数:" + userPage.getPages());
System.out.println("当前页数据:" + userPage.getRecords());

4. 乐观锁更新(解决并发修改问题)

// 修改前先获取用户信息
User user = userService.getById(1L);
user.setName("NewName");
user.setVersion(user.getVersion() + 1);// 更新时会自动判断 version 是否一致
userService.updateById(user);

5. 逻辑删除(替代物理删除)

只需在字段上加注解即可:

@TableLogic
private Integer deleted;

执行 removeById(id) 时会自动改为更新 deleted=1


💡 五、实战案例:用户管理系统(Spring Boot + MyBatis-Plus)

功能包括:

  • 用户增删改查
  • 分页列表展示
  • 模糊搜索姓名
  • 逻辑删除用户
  • 乐观锁更新用户信息

完整源码结构如下:

src/
├── main/
│   ├── java/
│   │   └── com.example.demo/
│   │       ├── controller/UserController.java
│   │       ├── service/UserService.java
│   │       ├── service/impl/UserServiceImpl.java
│   │       ├── mapper/UserMapper.java
│   │       └── entity/User.java
│   └── resources/
│       ├── application.yml
│       └── mapper/
└── test/

🚀 六、MyBatis-Plus 高级特性

✅ 代码生成器 AutoGenerator

  1. 自动生成

    • Entity(POJO 类)
    • Mapper(DAO 接口)
    • Mapper XML(SQL 映射文件)
    • Service & ServiceImpl(服务层)
    • Controller(Web 层)
  2. 支持特性

    • 自定义模板引擎(Velocity/Freemarker/Beetl)
    • 表前缀过滤、字段名转换
    • Lombok 支持
    • Swagger 注解集成
    • 覆盖已存在文件
使用步骤(Spring Boot 项目示例)
1. 添加依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.4</version> <!-- 使用最新版本 -->
</dependency>
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version> <!-- 模板引擎 -->
</dependency>
2. 编写生成器配置类
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;public class CodeGenerator {public static void main(String[] args) {// 1. 数据源配置DataSourceConfig dsc = new DataSourceConfig.Builder("jdbc:mysql://localhost:3306/your_db","root","password").build();// 2. 全局配置GlobalConfig gc = new GlobalConfig.Builder().outputDir(System.getProperty("user.dir") + "/src/main/java").author("YourName").openDir(false) // 生成后不打开目录.fileOverride() // 覆盖已生成文件.enableSwagger() // 开启 Swagger 注解.build();// 3. 包配置PackageConfig pc = new PackageConfig.Builder().parent("com.example").moduleName("system").entity("entity").mapper("mapper").service("service").controller("controller").build();// 4. 策略配置(表级)StrategyConfig sc = new StrategyConfig.Builder().addInclude("user", "role") // 指定生成表名.addTablePrefix("tbl_") // 过滤表前缀.entityBuilder().naming(NamingStrategy.underline_to_camel) // 字段转驼峰.enableLombok() // 使用 Lombok.logicDeleteColumnName("deleted") // 逻辑删除字段.controllerBuilder().enableRestStyle() // 生成 @RestController.build();// 5. 执行生成AutoGenerator generator = new AutoGenerator(dsc);generator.global(gc).packageInfo(pc).strategy(sc).execute();}
}

关键配置详解
配置项作用
DataSourceConfig配置数据库连接
GlobalConfig设置输出路径、作者、是否覆盖文件、开启 Swagger 等
PackageConfig定义包路径(entity/mapper/service 等子包名)
StrategyConfig核心配置
- addInclude():指定生成表
- addTablePrefix():过滤表前缀
- naming():字段命名策略
- enableLombok():简化实体类
TemplateConfig自定义模板(如需修改生成代码格式)

高级用法
1. 自定义模板
TemplateConfig tc = new TemplateConfig.Builder().entity("/templates/entity.java.vm") // 指定自定义实体模板路径.controller(null) // 不生成 Controller.build();
generator.template(tc);
2. 字段类型映射
StrategyConfig sc = new StrategyConfig.Builder().entityBuilder().addTableFills(new Column("create_time", FieldFill.INSERT)) // 自动填充.idType(IdType.AUTO) // 主键策略.columnNaming(NamingStrategy.no_change) // 字段名保持原样.build();
3. 生成 Service 接口时跳过已存在的方法
sc.serviceBuilder().formatServiceFileName("%sService") // 自定义 Service 接口名.superServiceClass(BaseService.class); // 自定义 Service 基类

生成结果示例
// Entity(Lombok 简化)
@Data
@TableName("tbl_user")
public class User {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;private String email;
}// Mapper 接口
public interface UserMapper extends BaseMapper<User> {}// Service 接口
public interface UserService extends IService<User> {}// Controller
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;
}

最佳实践
  1. 增量生成
    首次生成后,后续只生成新表代码时,通过 addInclude("new_table") 指定新表,避免覆盖自定义代码。

  2. 模板定制
    复制默认模板(在 mybatis-plus-generator 源码中)到 resources/templates 修改,实现个性化代码风格。

  3. 集成到构建流程
    通过 Maven/Gradle 插件在编译时自动生成代码(需额外配置)。

✅ 多租户支持(适用于 SaaS 架构)

通过 TenantLineInnerInterceptor 实现租户隔离。


💬 七、常见面试题解析

Q1: MyBatis-Plus 和 MyBatis 的区别?

答:MyBatis-Plus 是 MyBatis 的增强工具,提供了通用 CRUD、条件构造器、自动分页等封装,减少了重复代码。

Q2: 如何实现分页查询?

答:引入分页插件并使用 Page<T> 对象,结合 selectPage() 方法即可。

Q3: QueryWrapper 和 LambdaQueryWrapper 的区别?

答:QueryWrapper 使用字符串拼接字段名,容易出错;LambdaQueryWrapper 使用方法引用,类型安全。

Q4: 什么是逻辑删除?如何启用?

答:逻辑删除是“假删除”,通过字段标记是否删除。只需在字段上添加 @TableLogic 注解即可。

Q5: 如何实现乐观锁?

答:使用 @Version 注解标注版本号字段,并在更新时自动进行版本校验。


💥 八、总结

通过本文的学习,你应该已经掌握了:

  • MyBatis-Plus 的基本原理与使用方式
  • 如何使用 QueryWrapper 和 LambdaQueryWrapper 构建复杂查询条件
  • 如何实现自动分页、逻辑删除、乐观锁等高级功能
  • 与 Spring Boot 的整合方法
  • 代码生成器的使用技巧
  • 常见面试题解析

MyBatis-Plus 是 Java 持久层开发中的强大助手,既能保持灵活性,又能大幅提升开发效率,是构建高性能后端系统的首选之一。


  • 如果你在学习过程中遇到任何疑问,欢迎在评论区留言交流!
  • 👍 如果你觉得这篇文章对你有帮助,别忘了点赞、收藏、转发哦!

相关文章:

  • 免费 wordpress企业主题哈尔滨网站优化流程
  • 外贸网站外贸网站建设行吗成都网站seo报价
  • 网站开发多少工资同城推广平台有哪些
  • 怎么做网站链接支付抖音seo推广
  • 明年做哪些网站致富连云港seo优化公司
  • 大型电商网站开发惠州抖音seo策划
  • 如何将OBJ文件转成GLB文件
  • NVIDIA GPU架构学习笔记
  • 时序数据库IoTDB可实现的基本操作及命令汇总
  • Linux操作系统Nginx Web服务
  • 16、nrf52840蓝牙学习(唯一ID加密与解密)
  • VRRP:解决路由器单点故障的终极方案
  • wpa_supplicant连接到了路由,但是 udhcpc会分配到不同网段的ip,路由器ip为192.168.0网段,板子分配ip为192.168.1的网段
  • 2025.6.24总结
  • 数组题解——​合并区间【LeetCode】
  • Python 猜数字小游戏:Tkinter 实现的互动猜数挑战
  • json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig)
  • 【计算机组成原理01】:主存与Cache的地址映射
  • 【Docker基础】Docker容器管理:docker stop详解
  • 洛谷 删数的问题 贪心
  • C/C++库开发完全指南:从静态库到动态链接的深度解析
  • Unity反射机制
  • 【Linux网络与网络编程】15.DNS与ICMP协议
  • 报错:macOS 安装 sentencepiece
  • VIVADO导出仿真数据到MATLAB中进行分析
  • Spring Boot 中整合 Redis