MyBatis-Plus(简称 MP)是一款基于 MyBatis 的增强工具,在 MyBatis 原有功能基础上只做增强、不做改变,能够极大简化数据库 CRUD 操作,消除重复代码。本文将从零开始,手把手讲解SpringBoot 整合 MyBatis-Plus 的全过程,包含环境配置、依赖引入、代码编写、功能测试及常见基础配置,适合入门学习和项目落地使用。
一、前期准备
在开始整合前,需提前搭建好基础运行环境,保证工具、版本适配:
- 开发工具:IDEA / Eclipse(推荐 IDEA)
- 运行环境:JDK 8+、Maven 3.6+
- 数据库:MySQL 5.7 / 8.0(本文以 MySQL8.0 为例)
- 核心版本:SpringBoot 2.7.x 稳定版、MyBatis-Plus 3.5.x 稳定版
同时提前创建测试数据库和数据表,用于后续功能测试,本文创建简单的用户测试表。
-- 创建测试数据库
CREATE DATABASE IF NOT EXISTS mp_demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 使用数据库
USE mp_demo;
-- 创建用户测试表
CREATE TABLE IF NOT EXISTS user (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
name VARCHAR(30) NOT NULL COMMENT '用户名',
age INT DEFAULT 0 COMMENT '年龄',
email VARCHAR(50) DEFAULT '' COMMENT '邮箱',
create_time DATETIME COMMENT '创建时间',
update_time DATETIME COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '逻辑删除 0-未删除 1-已删除'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
二、创建SpringBoot项目并引入依赖
2.1 新建SpringBoot项目
通过 IDEA 新建 SpringBoot 初始化项目,选择对应 JDK 版本,勾选 MySQL Driver、Lombok 基础依赖,后续手动引入 MyBatis-Plus 核心依赖。
2.2 Maven核心依赖配置
在 pom.xml 文件中引入 SpringBoot 父依赖、MyBatis-Plus 启动器、MySQL 驱动、Lombok 等必备依赖,完整配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.15</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>mybatis-plus-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatis-plus-demo</name>
<description>SpringBoot整合MyBatis-Plus测试项目</description>
<properties>
<java.version>1.8</java.version>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
</properties>
<dependencies>
<!-- SpringBoot Web核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis-Plus启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Lombok 简化实体类代码 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
引入依赖后,刷新 Maven 项目,确保所有依赖下载成功,无报错。
三、全局配置文件配置
修改 application.yml 配置文件(若无则新建),配置数据库连接、MyBatis-Plus 日志、映射路径等核心参数,适配 MySQL8.0 版本。
# 服务端口
server:
port: 8080
# 数据库配置
spring:
datasource:
# 数据库驱动(MySQL8.0使用com.mysql.cj.jdbc.Driver,5.7使用com.mysql.jdbc.Driver)
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mp_demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root # 自己的数据库用户名
password: 123456 # 自己的数据库密码
# MyBatis-Plus配置
mybatis-plus:
# 映射文件路径
mapper-locations: classpath:mapper/*.xml
# 实体类别名包
type-aliases-package: com.example.mpdemo.entity
configuration:
# 开启SQL日志打印,开发环境便于调试
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 开启驼峰命名自动转换
map-underscore-to-camel-case: true
global-config:
# 关闭MP自带的banner
banner: false
db-config:
# 主键自增策略
id-type: auto
# 逻辑删除字段
logic-delete-field: deleted
logic-delete-value: 1 # 删除值
logic-not-delete-value: 0 # 未删除值
四、编写核心代码
MyBatis-Plus 采用 实体类+Mapper+Service 分层结构,无需编写 SQL 即可实现基础 CRUD,下面逐层编写代码。
4.1 项目结构搭建
新建标准分层包结构,结构如下:
com.example.mpdemo
├── MpDemoApplication.java // 启动类
├── entity // 实体类包
│ └── User.java
├── mapper // 持久层接口包
│ └── UserMapper.java
├── service // 业务层包
│ ├── UserService.java
│ └── impl
│ └── UserServiceImpl.java
└── controller // 控制层包
└── UserController.java
4.2 启动类配置
SpringBoot 启动类上添加 @MapperScan 注解,扫描 Mapper 接口包,让 MyBatis-Plus 识别持久层接口。
package com.example.mpdemo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// 扫描mapper接口所在包
@MapperScan("com.example.mpdemo.mapper")
@SpringBootApplication
public class MpDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MpDemoApplication.class, args);
}
}
4.3 实体类编写
创建 User 实体类,对应数据库 user 表,通过 MyBatis-Plus 注解绑定表和字段,配合 Lombok 简化代码。
package com.example.mpdemo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("user") // 绑定数据库表名
public class User {
// 主键,自增策略
@TableId(type = IdType.AUTO)
private Long id;
// 用户名,对应表中name字段
private String name;
// 年龄
private Integer age;
// 邮箱
private String email;
// 创建时间
private LocalDateTime createTime;
// 更新时间
private LocalDateTime updateTime;
// 逻辑删除字段
private Integer deleted;
}
4.4 Mapper持久层接口
创建 Mapper 接口,继承 MyBatis-Plus 提供的 BaseMapper,即可获得所有基础 CRUD 方法,无需手动编写 SQL。
package com.example.mpdemo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mpdemo.entity.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper extends BaseMapper<User> {
// 继承BaseMapper后,自带增删改查方法,无需手写
}
4.5 Service业务层
MyBatis-Plus 提供通用 Service 层接口和实现类,只需继承即可快速使用业务层封装的 CRUD 方法,代码更简洁。
1、Service接口
package com.example.mpdemo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.mpdemo.entity.User;
// 继承IService,传入实体类泛型
public interface UserService extends IService<User> {
}
2、Service实现类
package com.example.mpdemo.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.mpdemo.entity.User;
import com.example.mpdemo.mapper.UserMapper;
import com.example.mpdemo.service.UserService;
import org.springframework.stereotype.Service;
// 继承ServiceImpl,绑定Mapper和实体类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
4.6 Controller控制层
编写测试接口,调用 Service 层方法,实现新增、查询、修改、删除基础功能测试。
package com.example.mpdemo.controller;
import com.example.mpdemo.entity.User;
import com.example.mpdemo.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
// 查询所有用户
@GetMapping("/list")
public List<User> getUserList() {
return userService.list();
}
// 新增用户
@GetMapping("/add")
public String addUser() {
User user = new User();
user.setName("张三");
user.setAge(22);
user.setEmail("zhangsan@163.com");
boolean result = userService.save(user);
return result ? "新增成功" : "新增失败";
}
}
五、功能测试
启动 SpringBoot 项目,无报错后,通过浏览器或接口工具测试接口,验证整合是否成功。
- 访问
http://localhost:8080/user/add,执行新增用户操作,控制台可打印完整执行 SQL,数据库新增一条用户数据; - 访问
http://localhost:8080/user/list,可查询出所有用户数据,接口返回 JSON 格式结果; - 默认开启逻辑删除,调用删除接口不会物理删除数据,仅修改 deleted 字段为1。
六、常用进阶配置(必备)
6.1 自动填充时间字段
数据库表中 create_time、update_time 可通过 MP 自动填充,无需手动赋值,新建配置类:
package com.example.mpdemo.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
// 新增数据自动填充创建时间
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
}
// 修改数据自动填充更新时间
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
}
}
同时在实体类时间字段上添加自动填充注解:
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
6.2 分页插件配置
MP 分页查询需手动配置分页插件,新建 MP 全局配置类:
package com.example.mpdemo.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();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
七、常见问题总结
- 数据库连接报错:检查驱动类、url 时区配置、账号密码是否正确,MySQL8.0 必须配置
serverTimezone; - Mapper接口无法扫描:检查启动类
@MapperScan包路径是否正确; - 字段映射失败:开启驼峰命名转换,保证数据库下划线字段与实体类驼峰字段对应;
- 时间填充不生效:检查填充配置类是否注入 Spring 容器、实体类注解是否配置正确。
八、总结
SpringBoot 整合 MyBatis-Plus 核心流程可概括为:引入MP依赖 → 配置数据库与MP参数 → 启动类扫描Mapper → 实体类绑定数据表 → 继承BaseMapper与IService。整合完成后,无需编写基础 CRUD SQL,大幅提升开发效率,同时 MP 提供的分页、逻辑删除、自动填充、条件构造器等功能,能够满足绝大多数业务场景需求,是目前 Java 后端开发的主流持久层方案。