1. 项目概述
在Java企业级开发领域,SpringBoot3和MyBatis-Plus的组合已经成为快速构建数据驱动型应用的标准配置。这个技术栈特别适合需要快速迭代的中小型项目,从电商后台到OA系统都能看到它的身影。最近半年,随着SpringBoot3的稳定版发布,开发者社区对这套组合的关注度明显提升。
我最近为一个本地生活服务平台做技术咨询时,发现他们花了整整两天时间才搭好基础框架。这让我意识到,很多团队在项目初始化阶段就浪费了大量时间。本文将分享我经过20多个项目验证的极速搭建方案,包含最新版本的特性和实际踩坑经验。
2. 环境准备与工具选型
2.1 基础环境配置
推荐使用JDK17作为基础运行环境,这是SpringBoot3官方支持的最低版本。虽然JDK21已经发布,但考虑到企业环境的稳定性,17仍然是当前的最佳选择。安装时注意设置JAVA_HOME环境变量,这是很多初学者容易忽略的点。
开发工具方面,IntelliJ IDEA 2023.3+版本对SpringBoot3的支持最完善。社区版就足够使用,但终极版提供了更好的MyBatis插件支持。如果你习惯用VSCode,需要安装Spring Boot Extension Pack和MyBatisX插件组合。
2.2 依赖管理策略
使用Maven作为构建工具时,建议在pom.xml中通过dependencyManagement统一管理版本号。这是我推荐的依赖配置模板:
xml复制<properties>
<spring-boot.version>3.2.0</spring-boot.version>
<mybatis-plus.version>3.5.5</mybatis-plus.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
这种配置方式比直接写死版本号更利于后续升级维护。对于中小型项目,建议包含以下核心依赖:
- spring-boot-starter-web
- mybatis-plus-boot-starter
- spring-boot-starter-test
- druid-spring-boot-starter (数据库连接池)
- lombok (可选但强烈推荐)
3. 项目初始化实战
3.1 使用Spring Initializr创建项目
最快的方式是通过start.spring.io生成项目骨架。关键参数选择:
- Project: Maven
- Language: Java
- Spring Boot: 3.2.0
- Packaging: Jar
- Java: 17
在Dependencies中添加:
- Spring Web
- MyBatis Framework (注意不是MyBatis-Plus)
生成项目后,需要手动添加MyBatis-Plus依赖。这是因为官方的Initializr还没有集成MyBatis-Plus选项。添加以下依赖到pom.xml:
xml复制<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
3.2 基础配置调整
在application.yml中配置基本参数:
yaml复制server:
port: 8080
servlet:
context-path: /api
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志
global-config:
db-config:
logic-delete-field: deleted # 逻辑删除字段
logic-not-delete-value: 0
logic-delete-value: 1
注意:SpringBoot3默认使用Jakarta EE 9+,这意味着包路径从javax变为了jakarta。如果遇到类找不到的错误,检查import语句是否正确。
4. 核心功能实现
4.1 实体类与Mapper设计
使用MyBatis-Plus的Active Record模式可以极大简化开发。首先创建基础实体类:
java复制@Data
public class BaseEntity {
@TableId(type = IdType.AUTO)
private Long id;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
然后创建具体业务实体,比如用户模型:
java复制@Data
@TableName("sys_user")
@EqualsAndHashCode(callSuper = true)
public class User extends BaseEntity {
private String username;
private String password;
private Integer status;
@TableLogic
private Integer deleted;
}
对应的Mapper接口只需要简单继承:
java复制public interface UserMapper extends BaseMapper<User> {
// 可以添加自定义SQL方法
@Select("SELECT * FROM sys_user WHERE username = #{name}")
User selectByName(@Param("name") String username);
}
4.2 服务层与控制器实现
服务层示例:
java复制@Service
@RequiredArgsConstructor
public class UserService {
private final UserMapper userMapper;
public User getById(Long id) {
return userMapper.selectById(id);
}
public Page<User> page(Integer current, Integer size) {
return userMapper.selectPage(new Page<>(current, size), null);
}
}
控制器层使用SpringBoot3的新特性:
java复制@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping("/{id}")
public User get(@PathVariable Long id) {
return userService.getById(id);
}
@GetMapping
public Page<User> page(@RequestParam(defaultValue = "1") Integer current,
@RequestParam(defaultValue = "10") Integer size) {
return userService.page(current, size);
}
}
5. 高级功能配置
5.1 分页插件配置
MyBatis-Plus的分页功能需要单独配置拦截器:
java复制@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
这个配置让所有返回Page对象的方法自动实现物理分页。在Controller中可以直接使用Page对象接收前端参数。
5.2 SQL日志优化
开发阶段建议配置完整的SQL日志输出。在application.yml中添加:
yaml复制logging:
level:
com.example.demo.mapper: debug
配合p6spy可以实现更详细的SQL监控:
xml复制<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
然后在application.yml中修改数据源配置:
yaml复制spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://localhost:3306/demo
创建spy.properties文件:
properties复制module.log=com.p6spy.engine.logging.P6LogFactory
appender=com.p6spy.engine.spy.appender.StdoutLogger
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=%(executionTime)ms | %(category) | connection %(connectionId) | %(sqlSingleLine)
6. 常见问题排查
6.1 依赖冲突解决
SpringBoot3和MyBatis-Plus组合时常见的依赖冲突:
- javax与jakarta包冲突:确保所有依赖都使用jakarta版本
- MyBatis版本冲突:MyBatis-Plus自带MyBatis,不要额外引入
- Jackson版本问题:SpringBoot3使用Jackson 2.15+
使用mvn dependency:tree命令检查依赖树,发现冲突时使用exclusions排除:
xml复制<dependency>
<groupId>com.example</groupId>
<artifactId>problematic-lib</artifactId>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
6.2 事务管理问题
SpringBoot3默认使用Spring Framework 6的事务管理。常见问题包括:
- 事务不生效:检查方法是否为public,是否被同类方法调用
- 事务回滚失败:确认异常类型是否在@Transactional(rollbackFor=...)
推荐配置:
java复制@Transactional(rollbackFor = Exception.class)
public void businessMethod() {
// ...
}
6.3 MyBatis-Plus特有问题
-
字段自动填充失效:
- 确认实现了MetaObjectHandler
- 检查字段注解是否正确(@TableField(fill=...))
-
逻辑删除无效:
- 检查全局配置是否正确
- 确认实体类字段有@TableLogic注解
- 数据库字段类型与配置的值匹配
-
批量操作问题:
- updateBatchById需要主键存在
- 大数据量批处理建议使用自定义批量方法
7. 性能优化建议
7.1 连接池配置
Druid推荐配置:
yaml复制spring:
datasource:
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
test-while-idle: true
test-on-borrow: false
test-on-return: false
filters: stat,wall
7.2 MyBatis-Plus二级缓存
启用二级缓存配置:
yaml复制mybatis-plus:
configuration:
cache-enabled: true
实体类添加注解:
java复制@CacheNamespace
public class User extends BaseEntity {
// ...
}
注意:二级缓存适用于读多写少的场景,频繁更新的数据不建议使用。
7.3 SQL性能优化
- 避免使用select *,明确指定字段
- 复杂查询使用@Select注解手写SQL
- 关联查询考虑使用@TableField(exist=false) + 业务组装
- 大数据量分页使用优化器:
java复制Page<User> page = new Page<>(current, size);
page.setOptimizeCountSql(true);
8. 项目结构最佳实践
推荐的项目结构:
code复制src/main/java
├── com.example.demo
│ ├── config # 配置类
│ ├── controller # 控制器
│ ├── service # 服务层
│ │ ├── impl # 服务实现
│ ├── mapper # Mapper接口
│ ├── model # 实体类
│ │ ├── dto # 数据传输对象
│ │ ├── vo # 视图对象
│ │ ├── enums # 枚举类
│ ├── util # 工具类
│ └── DemoApplication.java
对于大型项目,可以按业务模块划分:
code复制src/main/java
├── com.example.demo
│ ├── module
│ │ ├── user
│ │ │ ├── controller
│ │ │ ├── service
│ │ │ ├── mapper
│ │ │ └── model
│ │ ├── product
│ │ │ ├── ...
9. 测试策略
9.1 单元测试配置
基础测试类配置:
java复制@SpringBootTest
@AutoConfigureMockMvc
@Transactional
@Rollback
public class BaseTest {
@Autowired
protected MockMvc mockMvc;
}
Mapper层测试示例:
java复制class UserMapperTest extends BaseTest {
@Autowired
private UserMapper userMapper;
@Test
void testSelect() {
User user = new User();
user.setUsername("test");
userMapper.insert(user);
User dbUser = userMapper.selectById(user.getId());
assertNotNull(dbUser);
assertEquals("test", dbUser.getUsername());
}
}
9.2 控制器测试
使用MockMvc测试控制器:
java复制@Test
void testGetUser() throws Exception {
mockMvc.perform(get("/users/1")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.username").exists());
}
9.3 集成测试
使用Testcontainers进行数据库集成测试:
java复制@Testcontainers
class UserServiceIT {
@Container
static MySQLContainer<?> mysql = new MySQLContainer<>("mysql:8.0");
@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", mysql::getJdbcUrl);
registry.add("spring.datasource.username", mysql::getUsername);
registry.add("spring.datasource.password", mysql::getPassword);
}
@Test
void testInRealDatabase() {
// 测试逻辑
}
}
10. 部署与监控
10.1 打包与运行
使用SpringBoot Maven插件打包:
bash复制mvn clean package
生产环境运行建议:
bash复制java -jar -Dspring.profiles.active=prod demo.jar --server.port=8080
10.2 Actuator监控
添加依赖:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置application.yml:
yaml复制management:
endpoints:
web:
exposure:
include: health,info,metrics
endpoint:
health:
show-details: always
10.3 生产环境建议
- 使用JVM参数调优:
bash复制
-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m - 配置日志轮转:
yaml复制logging: file: name: logs/app.log max-size: 10MB max-history: 7 - 使用外部化配置:
bash复制
java -jar demo.jar --spring.config.additional-location=file:/etc/config/
11. 进阶扩展方向
11.1 多数据源配置
使用dynamic-datasource-spring-boot-starter:
xml复制<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>4.2.0</version>
</dependency>
配置示例:
yaml复制spring:
datasource:
dynamic:
primary: master
datasource:
master:
url: jdbc:mysql://localhost:3306/master
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3306/slave
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
使用注解切换数据源:
java复制@DS("slave")
public List<User> getSlaveUsers() {
return userMapper.selectList(null);
}
11.2 分布式ID生成
集成MyBatis-Plus的分布式ID生成器:
java复制@Bean
public IdentifierGenerator idGenerator() {
return new DefaultIdentifierGenerator();
}
在实体类中使用:
java复制@TableId(type = IdType.ASSIGN_ID)
private Long id;
11.3 多租户实现
配置多租户拦截器:
java复制@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
@Override
public Expression getTenantId() {
return new StringValue("tenant_1");
}
@Override
public String getTenantIdColumn() {
return "tenant_id";
}
@Override
public boolean ignoreTable(String tableName) {
return !"sys_user".equalsIgnoreCase(tableName);
}
}));
return interceptor;
}
12. 项目优化实战技巧
12.1 自动生成代码
使用MyBatis-Plus代码生成器:
java复制public class CodeGenerator {
public static void main(String[] args) {
AutoGenerator generator = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
gc.setAuthor("YourName");
gc.setOpen(false);
generator.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/demo");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
generator.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.example.demo");
generator.setPackageInfo(pc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setInclude("sys_user", "sys_role");
generator.setStrategy(strategy);
generator.execute();
}
}
12.2 枚举类型处理
使用MyBatis-Plus的枚举处理器:
java复制@EnumValue
private UserStatus status;
public enum UserStatus {
ENABLED(1, "启用"),
DISABLED(0, "禁用");
@EnumValue
private final int code;
private final String desc;
// constructor and getters
}
配置枚举处理器:
yaml复制mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
12.3 JSON字段处理
处理JSON类型字段(MySQL 5.7+):
java复制@TableName(autoResultMap = true)
public class User {
@TableField(typeHandler = FastjsonTypeHandler.class)
private Map<String, Object> attributes;
}
对应的数据库字段类型为JSON,查询时需要添加typeHandler:
xml复制<resultMap id="userResultMap" type="User">
<result column="attributes" property="attributes" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler"/>
</resultMap>
13. 安全加固方案
13.1 SQL注入防护
- 永远不要拼接SQL语句
- 使用MyBatis-Plus的Wrapper构建查询条件
- 配置Druid的WallFilter:
yaml复制spring:
datasource:
druid:
filters: stat,wall
wall:
config:
multi-statement-allow: false
none-base-statement-allow: false
13.2 XSS防护
添加Spring Boot Starter Security依赖:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
配置基础安全规则:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/public/**").permitAll()
.anyRequest().authenticated()
)
.httpBasic();
return http.build();
}
}
13.3 敏感数据保护
- 密码字段使用加密存储:
java复制public String encryptPassword(String raw) {
return DigestUtils.md5DigestAsHex((raw + salt).getBytes());
}
- 返回DTO过滤敏感字段:
java复制@Data
public class UserDTO {
private Long id;
private String username;
// 不包含password字段
}
- 日志脱敏处理:
java复制@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
14. 性能监控与调优
14.1 Micrometer监控
添加依赖:
xml复制<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
配置application.yml:
yaml复制management:
endpoints:
web:
exposure:
include: prometheus
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
14.2 慢SQL监控
配置Druid的StatFilter:
yaml复制spring:
datasource:
druid:
filter:
stat:
enabled: true
slow-sql-millis: 1000
log-slow-sql: true
14.3 JVM监控
添加JVM参数:
bash复制-XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCDateStamps
-Xloggc:logs/gc.log -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=logs/ -XX:ErrorFile=logs/hs_err_pid%p.log
使用Arthas进行运行时诊断:
bash复制# 下载并运行
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
15. 容器化部署
15.1 Dockerfile配置
多阶段构建Dockerfile:
dockerfile复制# 构建阶段
FROM maven:3.8.6-eclipse-temurin-17 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
# 运行阶段
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY --from=build /app/target/demo.jar ./app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
构建并运行:
bash复制docker build -t demo-app .
docker run -p 8080:8080 -d demo-app
15.2 Docker Compose编排
完整环境编排示例:
yaml复制version: '3.8'
services:
app:
image: demo-app
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/demo
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: demo
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 10s
retries: 5
15.3 Kubernetes部署
基础Deployment配置:
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
spec:
replicas: 3
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: app
image: demo-app:latest
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: prod
---
apiVersion: v1
kind: Service
metadata:
name: demo-service
spec:
selector:
app: demo
ports:
- protocol: TCP
port: 80
targetPort: 8080
16. 持续集成与交付
16.1 GitHub Actions配置
基础CI流程:
yaml复制name: Java CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Maven
run: mvn -B package --file pom.xml
- name: Run Tests
run: mvn test
16.2 镜像自动构建
扩展CI流程构建Docker镜像:
yaml复制- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
push: true
tags: yourusername/demo-app:latest
16.3 部署到Kubernetes
使用kubectl进行蓝绿部署:
yaml复制- name: Install kubectl
uses: azure/setup-kubectl@v3
- name: Deploy to cluster
run: |
kubectl apply -f k8s/deployment.yaml
kubectl rollout status deployment/demo-app
env:
KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG }}
17. 现代化前端集成
17.1 接口文档生成
使用springdoc-openapi生成OpenAPI文档:
xml复制<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>
访问地址:http://localhost:8080/swagger-ui.html
17.2 接口版本管理
使用URL路径版本控制:
java复制@RestController
@RequestMapping("/api/v1/users")
public class UserControllerV1 {
// ...
}
@RestController
@RequestMapping("/api/v2/users")
public class UserControllerV2 {
// ...
}
17.3 统一响应封装
基础响应类:
java复制@Data
@AllArgsConstructor
public class R<T> implements Serializable {
private Integer code;
private String msg;
private T data;
public static <T> R<T> ok(T data) {
return new R<>(200, "success", data);
}
public static R<Void> error(Integer code, String msg) {
return new R<>(code, msg, null);
}
}
控制器统一返回:
java复制@GetMapping("/{id}")
public R<User> get(@PathVariable Long id) {
return R.ok(userService.getById(id));
}
18. 微服务演进方案
18.1 Spring Cloud集成
添加Spring Cloud依赖:
xml复制<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
18.2 服务注册与发现
使用Nacos作为注册中心:
xml复制<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置application.yml:
yaml复制spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
application:
name: user-service
18.3 分布式事务处理
使用Seata处理分布式事务:
xml复制<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
配置示例:
java复制@GlobalTransactional
public void crossServiceOperation() {
// 调用多个服务
orderService.create();
accountService.deduct();
}
19. 项目升级与维护
19.1 SpringBoot2到3的迁移
关键变更点处理:
-
Jakarta EE 9+包路径变更:
- javax -> jakarta
- 需要更新所有相关依赖
-
废弃配置项替换:
- server.servlet.context-path -> server.servlet.application-display-name
- spring.mvc.pathmatch.matching-strategy 默认值变更
-
Hibernate 6.x变更:
- @Column默认nullable=false
- 序列化机制变化
19.2 MyBatis-Plus升级策略
版本升级步骤:
- 备份当前pom.xml
- 逐步升级小版本(如3.4.x -> 3.5.x)
- 测试核心功能:
- 分页查询
- 逻辑删除
- 自动填充
- 处理破坏性变更:
- Wrapper条件构造器API变化
- 主键生成策略调整
19.3 长期维护建议
-
依赖版本管理:
- 使用Spring Boot的dependencyManagement
- 定期检查版本更新
-
自动化测试覆盖:
- 保持80%+的测试覆盖率
- 添加集成测试流水线
-
文档维护:
- 使用Swagger保持API文档同步
- 维护CHANGELOG.md记录重大变更
20. 项目实战经验总结
在实际企业项目中应用这套技术栈时,有几个关键点需要特别注意:
-
复杂查询处理:对于多表关联查询,MyBatis-Plus的Wrapper可能不够灵活。这时可以考虑:
- 使用@Select注解手写SQL
- 拆分为多个简单查询在服务层组装
- 引入QueryDSL增强查询能力
-
批量操作优化:默认的saveBatch性能在大量数据时可能不理想。解决方案:
- 使用rewriteBatchedStatements=true参数
- 实现自定义批量插入方法
- 考虑使用存储过程
-
缓存策略选择:根据业务特点选择合适的缓存:
- 本地缓存(Caffeine)适合高频读取、数据量小的场景
- Redis缓存适合分布式环境
- 二级缓存适合单机、读多写少的场景
-
监控体系建设:除了基础的Actuator端点,建议添加:
- 自定义业务指标监控
- 慢SQL告警
- 接口响应时间统计
-
团队协作规范:建立统一的开发规范:
- 分层架构约定
- 命名规则(DTO/VO后缀等)
- 异常处理策略
- 日志格式标准
这套技术栈经过多个百万级用户项目的验证,在保证开发效率的同时也能满足性能要求。关键在于根据实际业务场景做好技术选型和架构设计,避免过度设计,保持适度的前瞻性。
