# 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 新建项目

002

# 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映射文件目录(可选,本教程用注解方式)
1
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>
1
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());
1
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)
1
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;
    }
}
1
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;
}
1
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);
}
1
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);
}
1
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);
    }
}
1
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删除
    }
}
1
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);
	}

}
1
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 接口测试

以下是核心接口的测试示例:

  1. 查询所有用户:浏览器访问http://localhost:8080/user/list,返回JSON格式的用户列表。
  2. 分页查询用户:访问http://localhost:8080/user/page?pageNum=1&pageSize=2&username=admin,返回分页数据(总条数、当前页数据等)。
  3. 新增用户:用Postman发送POST请求http://localhost:8080/user,请求体为:
    {
        "username": "newuser",
        "email": "newuser@huerpu.cc",
        "age": 28
    }
    
    1
    2
    3
    4
    5
    返回true表示新增成功。
  4. 删除用户:用Postman发送DELETE请求http://localhost:8080/user/3(假设新增的用户ID为3),返回true表示删除成功。

最近更新: 2026/2/3
 |  Copyright © -Present Kelsen All Rights Reserved. | Author KelsenJing