1. 快速搭建SpringBoot3与MyBatis-Plus工程实践
作为一名长期使用Java生态的开发老兵,我发现在实际项目中快速搭建基础框架的能力至关重要。今天我将分享如何用最短时间构建一个基于SpringBoot 3和MyBatis-Plus的完整工程,这个组合在当前的Java企业级开发中几乎成了标配。
为什么选择这个技术栈?SpringBoot 3带来了对Java 17的全面支持,性能优化显著;而MyBatis-Plus作为MyBatis的增强工具,可以让我们少写至少60%的样板代码。两者结合使用,既能享受Spring生态的便利,又能保持对SQL的精细控制。
2. 环境准备与工程创建
2.1 基础环境配置
工欲善其事,必先利其器。以下是经过我多次验证的稳定环境组合:
- 开发工具:IntelliJ IDEA 2023.3.5(社区版足够用)
- JDK版本:Amazon Corretto 17(长期支持版)
- 数据库:MySQL 8.0.33(生产推荐使用云数据库RDS)
- 构建工具:Maven 3.9.1
注意:SpringBoot 3.x必须使用Java 17+,这是硬性要求。如果团队还在用Java 8,需要考虑降级到SpringBoot 2.7.x版本。
2.2 工程创建方式对比
2.2.1 自动创建(推荐新手)
IDEA内置的Spring Initializr是最快捷的方式:
- 新建项目选择"Spring Initializr"
- 项目设置:
- Type: Maven
- Language: Java
- Packaging: Jar
- Java: 17
- 依赖选择:
- Spring Web (基础Web支持)
- Lombok (简化POJO)
- MySQL Driver (数据库连接)
点击创建后,IDEA会自动生成标准的SpringBoot项目结构。这里有个小技巧:创建完成后立即在pom.xml中添加MyBatis-Plus依赖,避免后续手动添加:
xml复制<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
2.2.2 手动创建(适合老手)
对于需要深度定制的项目,我更喜欢手动创建:
- 新建Maven项目
- 在pom.xml中添加SpringBoot父依赖:
xml复制<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
</parent>
- 逐步添加所需starter依赖
手动创建的优势是可以完全控制项目结构,比如我通常会:
- 将配置文件放在config目录
- 按功能模块划分package
- 自定义Maven构建流程
3. MyBatis-Plus深度整合
3.1 数据层配置
数据库连接是项目的基础,这里分享我的最佳实践配置:
yaml复制spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
hikari:
maximum-pool-size: 20
minimum-idle: 5
关键点说明:
- 必须添加时区参数,避免时间转换问题
- 使用HikariCP连接池(SpringBoot默认)
- 生产环境密码应该使用加密配置
3.2 实体类与Mapper
MyBatis-Plus的核心优势在于它的通用Mapper。以部门表为例:
java复制@Data
@TableName("dept")
public class Dept {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String sex;
private String address;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
对应的Mapper接口极其简洁:
java复制@Mapper
public interface DeptMapper extends BaseMapper<Dept> {
// 所有基础CRUD方法已自动继承
}
3.3 服务层实现
服务层采用接口+实现类的标准模式:
java复制public interface DeptService extends IService<Dept> {
// 扩展自定义方法
List<Dept> findByName(String name);
}
@Service
public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept>
implements DeptService {
@Override
public List<Dept> findByName(String name) {
return lambdaQuery()
.eq(Dept::getName, name)
.list();
}
}
这里使用了MyBatis-Plus的lambda查询,这是我最喜欢的功能之一,它让代码更加类型安全且易读。
4. 常见问题与解决方案
4.1 启动时报错排查
问题1:Failed to configure a DataSource
解决方案:
- 检查数据库连接参数是否正确
- 确认MySQL服务已启动
- 检查网络连接是否通畅
问题2:MyBatis-Plus版本冲突
解决方案:
xml复制<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
</dependencies>
</dependencyManagement>
4.2 性能优化建议
- 启用MyBatis-Plus的二级缓存:
yaml复制mybatis-plus:
configuration:
cache-enabled: true
-
对于复杂查询,建议使用XML方式编写SQL,可以获得更好的性能
-
批量操作使用Service的saveBatch方法,比单条插入快10倍以上
5. 扩展功能实现
5.1 自动填充功能
实际项目中,我们经常需要记录数据的创建和修改时间。MyBatis-Plus提供了优雅的自动填充方案:
- 实现MetaObjectHandler接口:
java复制@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
- 在实体类中添加注解:
java复制@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
5.2 逻辑删除实现
现代系统很少真正删除数据,而是采用逻辑删除:
- 配置逻辑删除字段:
yaml复制mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted
logic-not-delete-value: 0
logic-delete-value: 1
- 在实体类中添加字段:
java复制@TableLogic
private Integer deleted;
这样,当调用deleteById等方法时,实际执行的是UPDATE语句而非DELETE。
6. 项目结构优化建议
经过多个项目实践,我总结出以下最佳项目结构:
code复制src/main/java
└── com
└── example
├── config # 配置类
├── controller # 控制器
├── service # 服务接口
├── impl # 服务实现
├── mapper # MyBatis Mapper
├── model # 实体类
│ ├── dto # 数据传输对象
│ ├── vo # 视图对象
│ └── po # 持久化对象
├── util # 工具类
└── Application.java
这种结构清晰明了,适合中大型项目开发。对于小型项目,可以适当简化,但建议至少保持controller/service/mapper/model的分层。
7. 开发效率提升技巧
7.1 代码生成器使用
MyBatis-Plus提供了强大的代码生成器,可以节省大量时间:
java复制FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis", "root", "123456")
.globalConfig(builder -> {
builder.author("author") // 设置作者
.outputDir("D://code"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.example"); // 设置父包名
})
.strategyConfig(builder -> {
builder.addInclude("dept") // 设置需要生成的表名
.entityBuilder()
.enableLombok(); // 启用Lombok
})
.execute();
运行这段代码,可以自动生成实体类、Mapper、Service和Controller。
7.2 热部署配置
开发时频繁重启很浪费时间,添加以下依赖实现热部署:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
然后在IDEA中开启自动编译:
- Settings → Build → Compiler → 勾选Build project automatically
- Ctrl+Shift+A → 搜索Registry → 勾选compiler.automake.allow.when.app.running
8. 生产环境注意事项
当项目准备上线时,有几个关键点需要注意:
- 连接池配置优化:
yaml复制spring:
datasource:
hikari:
maximum-pool-size: ${DB_MAX_POOL_SIZE:20}
minimum-idle: ${DB_MIN_IDLE:5}
idle-timeout: 30000
max-lifetime: 1800000
connection-timeout: 30000
- SQL日志控制:
yaml复制logging:
level:
com.example.mapper: debug # 开发环境
# com.example.mapper: warn # 生产环境
- MyBatis-Plus性能优化:
yaml复制mybatis-plus:
configuration:
default-executor-type: reuse # 重用预编译语句
cache-enabled: false # 生产环境建议关闭二级缓存
在实际部署中,我建议使用Docker容器化部署,配合Nginx反向代理和Redis缓存,可以轻松应对中小型系统的流量压力。