# SpringBoot集成MyBatis-Plus教程
# 1. 环境准备
# 1.1 必备环境
- IDEA 2023及以上版本(推荐Ultimate版)
- JDK 17+(SpringBoot 3.x强制要求JDK 17及以上,需提前配置环境变量)
- MySQL 8.4.8(确保服务正常启动,可远程访问目标数据库)
- Maven 3.9.4(IDEA自带Maven,无需额外安装,仅需配置镜像源)
# 1.2 环境验证
- 验证JDK:终端执行
java -version,输出JDK 17+版本信息即可。 - 验证MySQL:终端执行
mysql -h localhost -P 3306 -u root -p,输入密码root123能成功连接即可。 - 验证Maven:IDEA中打开
File > Settings > Build, Execution, Deployment > Build Tools > Maven,确认Maven路径和配置文件正常。
# 2. 创建SpringBoot项目
# 2.1 新建项目

# 2.2 企业级项目结构规划
创建完成后,手动完善如下目录结构(后续代码会按此结构编写):
cc.hep
├── config # 配置类(MyBatis-Plus、Druid、分页插件等)
├── controller # 控制层(RESTful接口)
├── entity # 实体类(对应数据库表)
├── mapper # 数据访问层(MyBatis-Plus Mapper接口)
├── service # 业务层接口
│ └── impl # 业务层实现类
├── utils # 工具类(可选,本教程暂不涉及)
├── SpringBootMyBatisPlusApplication.java # 项目启动类
└── resources
├── application.yml # 核心配置文件(替代properties,更易读)
└── mapper # MyBatis映射文件目录(可选,本教程用注解方式)
2
3
4
5
6
7
8
9
10
11
12
# 3. 引入核心依赖
替换项目中pom.xml的<dependencies>节点内容,以下依赖包含MyBatis-Plus、Druid、MySQL驱动、Lombok(简化实体类)等企业级必备依赖,版本已适配SpringBoot 3.5.9:
<?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>3.5.9</version>
<relativePath/>
</parent>
<groupId>cc.hep</groupId>
<artifactId>springboot-mybatis-plus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringBoot-MyBatis-Plus</name>
<description>SpringBoot-MyBatis-Plus</description>
<dependencies>
<!-- Spring Web 核心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis-Plus 启动器(适配Spring Boot 3) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.8</version>
<!-- 强制排除所有旧版本mybatis-spring -->
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</exclusion>
<!-- 排除Spring Boot默认的HikariCP,避免数据源冲突 -->
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 强制引入Spring 6兼容的mybatis-spring版本 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.3</version>
<scope>compile</scope>
</dependency>
<!-- Druid 3.x启动器(适配Spring Boot 3) -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.20</version>
</dependency>
<!-- MySQL驱动(Spring Boot 3+官方推荐) -->
<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>
<!-- 测试依赖 -->
<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>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# 4. 现有user表结构确认
你的user表已创建完成,结构如下(可执行SQL验证):
USE hep_springboot_db;
-- 查看表结构
DESC user;
-- 插入测试数据(可选,用于后续接口测试)
INSERT INTO user (username, email, age, created_time, updated_time) VALUES
('admin', 'admin@huerpu.cc', 25, NOW(), NOW()),
('test', 'test@huerpu.cc', 22, NOW(), NOW());
2
3
4
5
6
7
8
9
# 5. 核心配置
删除resources目录下的application.properties,新建application.yml,配置数据源(Druid)、MyBatis-Plus核心参数,直接使用你提供的数据库信息:
# Spring配置
spring:
# 数据源配置(Druid)
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 数据库连接信息(你的专属配置)
url: jdbc:mysql://localhost:3306/hep_springboot_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: root123
# MySQL 8.x驱动类
driver-class-name: com.mysql.cj.jdbc.Driver
# Druid连接池配置(企业级优化参数)
initial-size: 5 # 初始化连接数
min-idle: 5 # 最小空闲连接数
max-active: 20 # 最大活跃连接数
max-wait: 60000 # 获取连接的最大等待时间(毫秒)
time-between-eviction-runs-millis: 60000 # 检测空闲连接的间隔时间
min-evictable-idle-time-millis: 300000 # 连接最小空闲时间
validation-query: SELECT 1 FROM DUAL # 验证连接是否有效
test-while-idle: true # 空闲时验证连接
test-on-borrow: false # 获取连接时不验证(提升性能)
test-on-return: false # 归还连接时不验证
pool-prepared-statements: true # 开启PSCache
max-pool-prepared-statement-per-connection-size: 20
# MyBatis-Plus配置
mybatis-plus:
# 实体类包名(自动扫描别名)
type-aliases-package: com.hep.springbootmybatisplus.entity
# Mapper.xml文件位置(本教程用注解,可注释)
# mapper-locations: classpath:mapper/**/*.xml
# 配置主键生成策略(默认雪花算法)
global-config:
db-config:
id-type: AUTO # 主键自增(对应数据库AUTO_INCREMENT)
logic-delete-field: deleted # 逻辑删除字段名(可选)
logic-delete-value: 1 # 逻辑删除值
logic-not-delete-value: 0 # 逻辑未删除值
# 日志配置(开发环境开启,方便调试SQL)
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true # 开启下划线转驼峰(数据库sys_user -> 实体SysUser)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 6. MyBatis-Plus配置类
在config目录下创建MyBatisPlusConfig.java,配置分页插件(MyBatis-Plus核心增强功能),这是企业级项目必备的配置:
package cc.hep.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;
/**
* MyBatis-Plus核心配置类(企业级扩展)
*/
@Configuration
public class MyBatisPlusConfig {
/**
* 配置分页插件(MyBatis-Plus分页功能依赖此插件)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加MySQL分页插件,指定数据库类型
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 7. 实体类编写
在entity目录下创建User.java,对应你的user表,使用Lombok和MyBatis-Plus注解简化代码:
package cc.hep.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 用户实体类(对应user表)
*/
@Data // Lombok注解:自动生成get/set/toString/hashCode/equals等方法
@TableName("user") // 指定数据库表名
public class User {
/**
* 主键ID(对应数据库AUTO_INCREMENT)
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 用户名(非空)
*/
private String username;
/**
* 邮箱(非空)
*/
private String email;
/**
* 年龄(可空)
*/
private Integer age;
/**
* 创建时间(自动填充)
*/
@TableField(fill = FieldFill.INSERT) // 插入时自动填充
private LocalDateTime createdTime;
/**
* 更新时间(自动填充)
*/
@TableField(fill = FieldFill.INSERT_UPDATE) // 插入/更新时自动填充
private LocalDateTime updatedTime;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 8. Mapper层编写
在mapper目录下创建UserMapper.java,继承MyBatis-Plus的BaseMapper,无需编写任何SQL即可实现基础CRUD:
package cc.hep.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cc.hep.entity.User;
import org.apache.ibatis.annotations.Mapper;
/**
* 用户Mapper接口(数据访问层)
* 继承BaseMapper后,自动拥有CRUD方法,无需编写XML或注解SQL
*/
@Mapper // 标记为MyBatis Mapper接口(也可在启动类加@MapperScan)
public interface UserMapper extends BaseMapper<User> {
// 基础CRUD已由BaseMapper提供,如需自定义查询,可在此添加方法并编写SQL
// 示例:根据用户名查询用户
// @Select("SELECT * FROM user WHERE username = #{username}")
// User selectByUsername(String username);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 9. Service层编写
# 9.1 Service接口
在service目录下创建IUserService.java,继承MyBatis-Plus的IService(封装了更高级的业务方法):
package cc.hep.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import cc.hep.entity.User;
/**
* 用户业务层接口
* 继承IService后,拥有更丰富的业务方法(如批量操作、分页查询等)
*/
public interface IUserService extends IService<User> {
// 自定义业务方法:分页查询用户
IPage<User> selectUserPage(Page<User> page, User user);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 9.2 Service实现类
在service/impl目录下创建UserServiceImpl.java,继承ServiceImpl并实现IUserService:
package cc.hep.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cc.hep.entity.User;
import cc.hep.mapper.UserMapper;
import cc.hep.service.IUserService;
import org.springframework.stereotype.Service;
/**
* 用户业务层实现类
*/
@Service // 标记为Spring业务组件
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
/**
* 自定义分页查询用户(支持条件筛选)
*/
@Override
public IPage<User> selectUserPage(Page<User> page, User user) {
// 构建条件构造器(Lambda方式,避免硬编码字段名)
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 用户名模糊查询(若用户名不为空)
if (user.getUsername() != null && !user.getUsername().isEmpty()) {
queryWrapper.like(User::getUsername, user.getUsername());
}
// 邮箱模糊查询(若邮箱不为空)
if (user.getEmail() != null && !user.getEmail().isEmpty()) {
queryWrapper.like(User::getEmail, user.getEmail());
}
// 年龄筛选(若年龄不为空)
if (user.getAge() != null) {
queryWrapper.eq(User::getAge, user.getAge());
}
// 按更新时间降序排序
queryWrapper.orderByDesc(User::getUpdatedTime);
// 分页查询(MyBatis-Plus自动拼接分页SQL)
return baseMapper.selectPage(page, queryWrapper);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 10. Controller层编写(接口层,RESTful风格)
在controller目录下创建UserController.java,提供RESTful接口,供前端调用:
package cc.hep.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import cc.hep.entity.User;
import cc.hep.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 用户控制器(RESTful接口)
* 基础路径:/user
*/
@RestController // 等同于@Controller + @ResponseBody
@RequestMapping("/user") // 接口基础路径
public class UserController {
// 注入业务层对象
@Autowired
private IUserService userService;
/**
* 1. 查询所有用户
* 请求方式:GET
* 请求路径:/user/list
*/
@GetMapping("/list")
public List<User> list() {
return userService.list(); // IService内置方法,查询所有
}
/**
* 2. 分页查询用户(支持条件筛选)
* 请求方式:GET
* 请求路径:/user/page
* 参数:pageNum(页码)、pageSize(每页条数)、username(用户名,可选)、email(邮箱,可选)、age(年龄,可选)
*/
@GetMapping("/page")
public IPage<User> page(
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize,
@RequestParam(required = false) String username,
@RequestParam(required = false) String email,
@RequestParam(required = false) Integer age
) {
// 创建分页对象
Page<User> page = new Page<>(pageNum, pageSize);
// 构建查询条件
User user = new User();
user.setUsername(username);
user.setEmail(email);
user.setAge(age);
// 调用业务层分页查询方法
return userService.selectUserPage(page, user);
}
/**
* 3. 根据ID查询用户
* 请求方式:GET
* 请求路径:/user/{id}
*/
@GetMapping("/{id}")
public User getById(@PathVariable Long id) {
return userService.getById(id); // IService内置方法,根据ID查询
}
/**
* 4. 新增用户
* 请求方式:POST
* 请求路径:/user
* 参数:JSON格式的用户信息
*/
@PostMapping
public boolean save(@RequestBody User user) {
return userService.save(user); // IService内置方法,新增
}
/**
* 5. 根据ID更新用户
* 请求方式:PUT
* 请求路径:/user
* 参数:JSON格式的用户信息(必须包含ID)
*/
@PutMapping
public boolean update(@RequestBody User user) {
return userService.updateById(user); // IService内置方法,根据ID更新
}
/**
* 6. 根据ID删除用户
* 请求方式:DELETE
* 请求路径:/user/{id}
*/
@DeleteMapping("/{id}")
public boolean delete(@PathVariable Long id) {
return userService.removeById(id); // IService内置方法,根据ID删除
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# 11. 启动类配置
修改项目启动类SpringBootMyBatisPlusApplication.java,添加@MapperScan注解扫描Mapper包(企业级推荐方式):
package cc.hep;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 启动类
* 关键:@MapperScan 扫描的包路径要准确指向你的Mapper接口所在包
*/
@SpringBootApplication
// 替换为你实际的Mapper包路径(必须是userMapper所在的包)
@MapperScan("cc.hep.mapper")
public class SpringBootMyBatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMyBatisPlusApplication.class, args);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 12. 项目测试
# 12.1 启动项目
点击IDEA右上角的启动按钮(或右键启动类执行Run),控制台输出===== SpringBoot-MyBatis-Plus项目启动成功 =====且无报错,说明项目启动正常。
# 12.2 接口测试
以下是核心接口的测试示例:
- 查询所有用户:浏览器访问
http://localhost:8080/user/list,返回JSON格式的用户列表。 - 分页查询用户:访问
http://localhost:8080/user/page?pageNum=1&pageSize=2&username=admin,返回分页数据(总条数、当前页数据等)。 - 新增用户:用Postman发送POST请求
http://localhost:8080/user,请求体为:返回{ "username": "newuser", "email": "newuser@huerpu.cc", "age": 28 }1
2
3
4
5true表示新增成功。 - 删除用户:用Postman发送DELETE请求
http://localhost:8080/user/3(假设新增的用户ID为3),返回true表示删除成功。