跳到主要内容

MyBatis Plus 教程

欢迎学习 MyBatis Plus!本教程将带你从零基础开始,全面掌握 MyBatis Plus 框架的核心功能和实战技能。

什么是 MyBatis Plus?

MyBatis Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了通用的 CRUD 操作、强大的条件构造器、代码生成器等功能,大大减少了开发人员的工作量。

核心特性

特性说明
无侵入只做增强不做改变,引入不会对现有工程产生影响
强大的 CRUD内置通用 Mapper、Service,少量配置即可实现单表大部分 CRUD 操作
支持 Lambda通过 Lambda 表达式方便编写各类查询条件
支持主键自动生成支持多达 4 种主键策略
内置分页插件基于 MyBatis 物理分页,配置好插件后即可使用
内置代码生成器采用代码或 Maven 插件可快速生成 Mapper、Model、Service、Controller 层代码
内置性能分析插件可输出 SQL 语句及其执行时间
内置全局拦截插件提供全表 delete、update 操作智能分析阻断

MyBatis vs MyBatis Plus

对比项MyBatisMyBatis Plus
XML 配置需要编写大量 XML大部分情况无需 XML
CRUD 操作需要手写 SQL内置通用 CRUD
分页功能需要手写分页 SQL内置分页插件
代码生成无内置内置代码生成器
条件构造手写动态 SQL提供 Wrapper 条件构造器
多租户需要自己实现内置多租户支持

为什么学习 MyBatis Plus?

1. 提高开发效率

使用 MyBatis Plus 可以显著减少样板代码:

// 传统 MyBatis 需要编写
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(Long id);

@Insert("INSERT INTO user(name, age, email) VALUES(#{name}, #{age}, #{email})")
int insert(User user);

// MyBatis Plus 继承 BaseMapper 即可
public interface UserMapper extends BaseMapper<User> {
// 无需编写任何方法,自动拥有 CRUD 功能
}

2. 强大的条件构造器

复杂查询变得简单直观:

// 查询年龄大于 18 且名字包含 "张" 的用户,按年龄降序
List<User> users = userMapper.selectList(
new LambdaQueryWrapper<User>()
.gt(User::getAge, 18)
.like(User::getName, "张")
.orderByDesc(User::getAge)
);

3. 企业级应用广泛

MyBatis Plus 在国内企业中应用广泛,是 Java 后端开发的必备技能之一。

环境准备

Maven 依赖

根据你的 Spring Boot 版本选择对应的依赖:

Spring Boot 2.x:

<dependencies>
<!-- MyBatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.15</version>
</dependency>

<!-- 数据库驱动(以 MySQL 为例) -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>

<!-- Lombok(可选,简化代码) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

Spring Boot 3.x:

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.15</version>
</dependency>

Spring Boot 4.x(自 3.5.13 开始支持):

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot4-starter</artifactId>
<version>3.5.15</version>
</dependency>

选择正确的 starter 非常重要,不同版本的 Spring Boot 对应不同的 MyBatis 和 Spring 整合方式,使用错误的 starter 可能导致启动失败或运行时错误。

配置文件

# application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: 123456

mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: auto
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0

快速开始

创建实体类,实体类是数据库表与 Java 对象之间的桥梁。通过注解,MyBatis Plus 能够自动完成对象关系映射:

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;

@Data
@TableName("t_user") // 指定对应的数据库表名,不配置则默认类名转下划线
public class User {

/**
* 主键 ID
* IdType.AUTO 表示使用数据库自增主键
* 其他策略:ASSIGN_ID(雪花算法)、ASSIGN_UUID、INPUT(手动输入)
*/
@TableId(type = IdType.AUTO)
private Long id;

/**
* 用户名
* 默认会将驼峰命名转为下划线:userName -> user_name
*/
private String name;

/** 年龄 */
private Integer age;

/** 邮箱 */
private String email;

/**
* 创建时间
* FieldFill.INSERT 表示插入时自动填充
* 需要配合 MetaObjectHandler 实现
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;

/**
* 更新时间
* FieldFill.INSERT_UPDATE 表示插入和更新时都自动填充
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;

/**
* 逻辑删除标识
* 0 表示未删除,1 表示已删除
* 删除操作会变成 UPDATE,查询时会自动过滤已删除数据
*/
@TableLogic
private Integer deleted;
}

创建 Mapper 接口,继承 BaseMapper 后无需编写任何 SQL,即可获得完整的 CRUD 能力:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper // 标记为 MyBatis 的 Mapper 接口,Spring 会自动扫描并创建代理对象
public interface UserMapper extends BaseMapper<User> {
// 继承 BaseMapper 后自动拥有以下方法:
// - insert(T entity) 插入一条记录
// - deleteById(Serializable id) 根据 ID 删除
// - updateById(T entity) 根据 ID 更新
// - selectById(Serializable id) 根据 ID 查询
// - selectList(Wrapper<T> wrapper) 条件查询列表
// - selectPage(IPage<T> page, Wrapper<T> wrapper) 分页查询
// ...更多方法见后续章节
}

使用示例,下面演示最基本的 CRUD 操作:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;

@SpringBootTest
class QuickStartTest {

@Autowired
private UserMapper userMapper;

/**
* 插入操作示例
* insert 方法会根据实体类的非空字段生成 INSERT 语句
* 主键使用 AUTO 策略时,插入成功后 ID 会自动回填到实体对象
*/
@Test
void testInsert() {
User user = new User();
user.setName("张三");
user.setAge(25);
user.setEmail("[email protected]");

int result = userMapper.insert(user);
System.out.println("插入成功,影响行数:" + result);
// 主键自动回填,可以直接获取生成的 ID
System.out.println("自动生成的 ID:" + user.getId());
// 生成的 SQL: INSERT INTO t_user (name, age, email) VALUES ('张三', 25, '[email protected]')
}

/**
* 根据 ID 查询
* selectById 是最常用的单条查询方法
*/
@Test
void testSelectById() {
User user = userMapper.selectById(1L);
System.out.println(user);
// 生成的 SQL: SELECT id, name, age, email FROM t_user WHERE id = 1
}

/**
* 查询全部数据
* 传入 null 表示无条件查询
* 实际开发中应避免全表查询,数据量大时会导致性能问题
*/
@Test
void testSelectList() {
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
// 生成的 SQL: SELECT id, name, age, email FROM t_user
}

/**
* 根据 ID 更新
* updateById 只更新实体类中非 null 的字段
* 这意味着如果你想将某个字段更新为 null,需要使用 UpdateWrapper
*/
@Test
void testUpdate() {
User user = new User();
user.setId(1L);
user.setAge(26); // 只更新 age 字段

int result = userMapper.updateById(user);
System.out.println("更新成功,影响行数:" + result);
// 生成的 SQL: UPDATE t_user SET age = 26 WHERE id = 1
}

/**
* 根据 ID 删除
* 如果配置了逻辑删除,实际执行的是 UPDATE 语句
*/
@Test
void testDelete() {
int result = userMapper.deleteById(1L);
System.out.println("删除成功,影响行数:" + result);
// 物理删除 SQL: DELETE FROM t_user WHERE id = 1
// 逻辑删除 SQL: UPDATE t_user SET deleted = 1 WHERE id = 1 AND deleted = 0
}
}

教程目录

本教程涵盖从入门到进阶的完整内容:

基础入门

核心功能

插件扩展

  • 插件扩展 - 多租户、动态表名、数据权限、乐观锁等插件
  • 多数据源 - 读写分离、多库操作的实现方案

高级特性

  • 高级特性 - 枚举处理、类型处理器、SQL 注入器

知识速查

学习建议

1. 前置知识

学习 MyBatis Plus 前需要掌握:

  • Java 基础:面向对象、集合框架、Lambda 表达式
  • Spring Boot:依赖注入、配置管理、自动装配
  • MyBatis 基础:了解 MyBatis 的基本概念和使用方式
  • SQL 基础:增删改查、条件查询、多表关联

2. 学习路径

基础阶段          核心阶段          进阶阶段          实战阶段
│ │ │ │
▼ ▼ ▼ ▼
环境配置 → 基础 CRUD → 代码生成器 → 项目实战
快速开始 → 条件构造器 → 插件扩展 → 性能优化
MyBatis基础 → 分页查询 → 多数据源 → 最佳实践
代码生成器 → 高级特性 → 企业级应用

3. 实践建议

  • 动手实践:每行代码都要亲自敲一遍
  • 对比学习:对比 MyBatis 和 MyBatis Plus 的差异
  • 阅读源码:了解核心功能的实现原理
  • 项目实战:在实际项目中应用所学知识

参考资源

官方资源

学习资源

准备好了吗?

准备好开始学习 MyBatis Plus 了吗?本教程将带你深入了解 MyBatis Plus 的核心功能和最佳实践。点击下一章开始你的学习之旅!