第一章: [基础] 快速入门与环境配置
第一章: [基础] 快速入门与环境配置
Prorise第一章. [基础] 快速入门与环境配置
摘要:本章的目标是 用最快的速度搭建一个可以运行 Mybatis-Plus 的最小化 Spring Boot 3 项目。我们将聚焦于“生产级”的环境构建,不仅要跑通 Demo,更要从一开始就遵循阿里编码规约(Alibaba Java Coding Guidelines),掌握企业级表结构设计、依赖冲突解决以及 MP 核心组件的配置原理,为后续的高阶实战打下坚实地基。
本章学习路径
- 技术定调:深刻理解 Mybatis-Plus (MP) 相较于原生 MyBatis 的核心优势(不仅是少写 SQL,更是架构思维的转变)。
- 环境构建:分步构建基于 JDK 21 + Spring Boot 3.4 + MP 3.5.7 的现代化技术栈。
- 规约落地:创建符合大厂规范的数据库表结构(包含乐观锁、逻辑删除、审计字段)。
- 映射实战:通过“三步走”策略定义实体类,彻底掌握
@TableName、@TableId等核心注解。 - 启动验证:编写单元测试,跑通第一个“零 SQL”查询,验证环境闭环。
1.1. Mybatis-Plus 简介与核心优势
对于一位已经熟练掌握 Spring Boot 和原生 MyBatis 的开发者而言,MyBatis 的优点——完全掌控 SQL 的灵活性——毋庸置疑。但与此同时,其固有的开发痛点也同样突出。
痛点回顾:在原生 MyBatis 开发中,我们深受 样板代码(Boilerplate Code) 之苦。即便是一个最基础的单表“根据 ID 查询”功能,我们依然需要三步走:定义 Mapper 接口方法 -> 编写 XML 映射文件 -> 编写 SQL 语句。这种重复性劳动在项目初期和快速迭代中,会显著拖慢开发效率,且容易因拼写错误导致运行时异常。
为了更直观地展示这种差异,我们通过以下对比来感受 MP 的核心价值:
痛点:步骤繁琐,修改字段需同步修改 XML,维护成本高。
- Mapper 层:在
UserMapper接口中定义方法。1
User selectById(Long id);
- XML 层:在
UserMapper.xml中手写 SQL。1
2
3<select id="selectById" resultType="com.demo.User">
SELECT * FROM tb_user WHERE id = #{id}
</select> - Service 层:调用接口。
优势:零 SQL,零 XML,开箱即用。
- Mapper 层:让接口继承
BaseMapper,泛型指定实体类。1
public interface UserMapper extends BaseMapper<User> {}
- XML 层:完全不需要(针对基础 CRUD)。
- Service 层:直接调用继承自
IService或BaseMapper的现成方法。1
2// 直接拥有 selectById, insert, update, deleteById 等 17+ 个通用方法
User user = userMapper.selectById(id);
MP 的核心价值主张非常清晰:“只做增强,不做改变”。它完美继承了 MyBatis 的所有功能,并通过内置通用 Mapper 和 Service,将我们从繁琐、重复的 CRUD 代码中彻底解放出来。这使得我们能更专注于复杂的业务逻辑,也正是我们称之为 MyBatis 最佳搭档 的根本原因。
1.2. 项目环境搭建
为了确保学习的先进性和稳定性,我们将采用 2025 年主流的 Spring Boot 3 + JDK 21 技术栈。
1.2.1. 技术栈版本说明
| 技术栈 | 版本 | 说明 |
|---|---|---|
| JDK | 21 | LTS (长期支持版),虚拟线程的基础 |
| Spring Boot | 3.4.x | 现代 Java 应用开发的事实标准 |
| Mybatis-Plus | 3.5.7+ | 完美适配 Spring Boot 3 的最新稳定版 |
| MySQL Driver | 8.0.33 | 官方推荐的 MySQL 8+ 驱动 |
| Maven | 3.8+ | 项目构建与依赖管理工具 |
1.2.2. Maven 依赖配置 (pom.xml)
我们将分三步来配置 pom.xml,以避免一次性堆砌代码造成的混乱。
第一步:父工程与核心属性
首先,我们需要指定 Spring Boot 的父工程,并定义版本号变量,以便于后续统一管理。
1 | <parent> |
第二步:核心依赖引入
接下来,引入 MP、数据库驱动和常用工具库。
注意:在 Spring Boot 3.x 中,必须使用 mybatis-plus-spring-boot3-starter。如果错误引入了旧版的 mybatis-plus-boot-starter,会导致严重的依赖冲突(如 NestedIOException)。
1 | <dependencies> |
第三步:构建插件
最后,添加 Maven 构建插件,确保项目能正确打包。
1 | <build> |
1.3. 数据源与 MP 基础配置
有了依赖,我们需要告知 Spring Boot 如何连接数据库,以及 MP 应该如何工作。我们推荐使用 YAML 格式,因为它层次分明。
1.3.1. 配置数据库连接
文件路径:src/main/resources/application.yml
在配置数据源之前,请注意两个细节:
- 时区问题:URL 中必须指定
serverTimezone,否则读取到的时间可能与数据库相差 8 小时。 - 驱动类名:MySQL 8.x 推荐使用
com.mysql.cj.jdbc.Driver(带cj)。
1 | server: |
1.3.2. 配置 MyBatis-Plus 行为
接下来,我们需要配置 MP 的核心行为。这里有两个至关重要的配置项:
- 驼峰映射:解决数据库字段
user_name和 Java 属性userName命名不一致的问题。 - SQL 日志:开发阶段必须开启,只有看到实际生成的 SQL,我们才能真正掌握 MP 的运行逻辑。
1 | mybatis-plus: |
1.4. 核心文件创建:规约与映射
环境就绪后,我们将进入核心开发阶段。本节将严格遵循《阿里巴巴 Java 开发手册》,演示如何设计一张“企业级”的数据库表,并将其映射为 Java 实体。
1.4.1. 数据库表结构 (tb_user)
在真实的企业项目中,一张表不仅仅包含业务字段,还必须包含用于运维和审计的“标配字段”。
执行 SQL 脚本:
1 | -- 创建数据库 |
设计解读:
unsigned:对于 ID、年龄、版本号等非负字段,使用无符号类型可以扩大数值范围。gmt_create/gmt_modified:遵循阿里规约,使用gmt(Greenwich Mean Time) 前缀,明确时间标准。is_deleted:逻辑删除是防止误删数据的最后一道防线,MP 对此有原生支持。
1.4.2. 实体类 (UserDO.java)
实体类(Entity/DO)是数据库表在内存中的镜像。我们将分三步来编写这个类,逐步揭示 MP 注解的奥秘。
文件路径:src/main/java/com/example/mpstudy/domain/UserDO.java
步骤一:基础映射与表名绑定
首先,我们需要解决类名 UserDO 与表名 tb_user 不一致的问题。
1 | package com.example.mpstudy.domain; |
步骤二:主键策略配置
主键是数据库的灵魂。MP 提供了多种主键生成策略,这里我们需要特别注意。
1 | import com.baomidou.mybatisplus.annotation.IdType; |
步骤三:逻辑删除与审计字段映射
最后,我们处理那些“企业级特性”字段。MP 能够自动识别驼峰与下划线的转换(如 is_deleted -> isDeleted),但对于逻辑删除功能,我们需要添加特定注解。
1 | import com.baomidou.mybatisplus.annotation.TableLogic; |
1.5. Mapper 接口与启动扫描
这是最令人舒适的一步——我们只需要定义接口,剩下的交给 MP。
1.5.1. 创建 Mapper 接口
文件路径:src/main/java/com/example/mpstudy/mapper/UserMapper.java
1 | package com.example.mpstudy.mapper; |
1.5.2. 配置扫描路径 (@MapperScan)
定义了接口如果不告诉 Spring,容器是无法管理它们的。这是新手最容易遗漏的一步。
文件路径:src/main/java/com/example/mpstudy/MpStudyApplication.java
1 | package com.example.mpstudy; |
1.6. 启动验证:Hello World
一切准备就绪,我们通过单元测试来验证环境是否通畅,并观察 MP 到底在背后做了什么。
文件路径:src/test/java/com/example/mpstudy/MpStudyApplicationTests.java
我们编写一个简单的测试用例,查询所有用户。
1 |
|
运行结果与日志分析:
点击运行,观察控制台输出。你将看到如下神奇的日志:
1 | ----- 验证查询功能 ------ |
关键现象解读:
- SQL 自动生成:我们要么没写 SQL,要么没写 XML,但 MP 帮我们生成了标准的
SELECT ...语句。 - 逻辑删除生效:请注意 SQL 的末尾自动拼接了
WHERE is_deleted=0。这证明我们在实体类上加的@TableLogic注解生效了,MP 自动过滤掉了被标记删除的数据。 - 驼峰自动映射:数据库的
gmt_create成功填充到了实体类的gmtCreate字段中。
1.7. 本章总结与环境配置速查
1.7.1. 场景一:Spring Boot 3 集成 MP 标准配置
需求:在 JDK 17+ 环境下,快速集成 MyBatis-Plus。
方案:引入 boot3-starter 并配置基础 YAML。
代码模版:
1 | <!-- 1. pom.xml 关键依赖 --> |
1 | # 2. application.yml 关键配置 |
1.7.2. 场景二:主键策略选择
需求:根据数据库表设计,选择正确的 ID 生成策略。
方案:使用 @TableId 注解。
代码模版:
1 | // 场景 A:数据库 ID 为 auto_increment (适合单体应用) |
1.7.3. 核心避坑指南
启动报错
UserMapper not found/NoSuchBeanDefinitionException- 现象:Spring 容器启动失败,提示找不到 Mapper Bean。
- 原因:忘记在启动类上添加
@MapperScan,或者扫描包路径错误。 - 对策:检查启动类注解:
@MapperScan("com.你的包名.mapper")。
插入报错
Data truncation: Out of range value- 现象:插入数据时报错,提示 ID 数值超出范围。
- 原因:Java 实体类 ID 为
Long,数据库字段为int,且未配置@TableId(type = IdType.AUTO)。MP 默认生成 19 位雪花 ID,超出了int的存储范围。 - 对策:修改数据库 ID 为
bigint,或在实体类显式指定IdType.AUTO。
报错
NestedIOException/ 类加载错误- 现象:Spring Boot 3 启动报错,堆栈信息包含 ASM 或 CGLIB 错误。
- 原因:引入了旧版的
mybatis-plus-boot-starter(适配 Boot 2.x)。 - 对策:确保
pom.xml引入的是mybatis-plus-spring-boot3-starter。







