1. 技术栈全景解析
这套组合拳在Java后端开发领域的地位,就像厨房里的"油盐酱醋"四件套。Spring Boot提供了开箱即用的脚手架,MyBatis处理数据持久化,Maven管理项目依赖,MySQL则是经典的关系型数据库选择。我经手的企业级项目中,80%的中小型系统都采用这个技术组合,特别是在需要快速迭代的互联网产品中。
为什么这个组合如此流行?Spring Boot的自动配置让开发者摆脱了XML地狱,MyBatis的SQL灵活性比Hibernate更适合复杂查询场景,Maven的依赖管理解决了Jar包冲突这个经典难题,而MySQL作为开源数据库的标杆,在事务处理和性能之间取得了良好平衡。去年帮一家电商公司重构系统时,我们仅用两周就基于这套技术栈搭建起了日均10万订单的处理能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境搭建实战
2.1 工具链选择与配置
工欲善其事必先利其器,我的开发机常年标配:
- IntelliJ IDEA Ultimate版(社区版也够用)
- MySQL 8.0+(注意配置lower_case_table_names=1避免大小写问题)
- Maven 3.6.3+(新版有时会有依赖解析问题)
- JDK 11(LTS版本,兼容性最佳)
重要提示:强烈建议使用Docker运行MySQL而非本地安装,避免污染开发环境。这里给出我的常用命令:
bash复制docker run --name mysql8 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
2.2 项目骨架生成
使用Spring Initializr创建项目时,这几个依赖必选:
- Spring Web(构建RESTful API)
- MyBatis Framework(数据库访问)
- MySQL Driver(数据库连接)
- Lombok(减少样板代码)
我习惯用curl直接生成基础项目:
bash复制curl https://start.spring.io/starter.zip -d dependencies=web,mybatis,mysql,lombok -d type=maven-project -d javaVersion=11 -d packaging=jar -o demo.zip
3. 核心配置详解
3.1 多环境配置策略
实际项目中必须区分开发、测试、生产环境。这是我的配置方案:
code复制resources/
├── application-dev.yml
├── application-prod.yml
└── application-test.yml
关键配置项示例(application-dev.yml):
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
configuration:
map-underscore-to-camel-case: true
踩坑记录:MySQL 8.0+必须指定serverTimezone参数,否则会报时区错误。生产环境一定要启用SSL并配置白名单。
3.2 MyBatis最佳实践
3.2.1 动态SQL技巧
这是我常用的动态查询模板(UserMapper.xml):
xml复制<select id="selectUsers" resultType="User">
SELECT * FROM users
<where>
<if test="name != null">
AND name LIKE CONCAT('%',#{name},'%')
</if>
<if test="status != null">
AND status = #{status}
</if>
</where>
ORDER BY create_time DESC
LIMIT #{offset}, #{pageSize}
</select>
3.2.2 注解与XML的取舍
简单CRUD可以用注解:
java复制@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User findById(Long id);
}
但复杂查询建议坚持用XML:
- SQL可读性更好
- 便于复用SQL片段
- 支持动态SQL
- 方便DBA审核
4. 高级特性实现
4.1 事务管理实战
Spring声明式事务的经典用法:
java复制@Service
@RequiredArgsConstructor
public class OrderService {
private final OrderMapper orderMapper;
private final InventoryMapper inventoryMapper;
@Transactional(rollbackFor = Exception.class)
public void createOrder(Order order) {
orderMapper.insert(order);
inventoryMapper.decreaseStock(order.getProductId(), order.getQuantity());
// 模拟业务异常
if (order.getQuantity() > 100) {
throw new RuntimeException("单笔订单不能超过100件");
}
}
}
事务陷阱:默认只回滚RuntimeException,必须用rollbackFor指定Exception.class才能捕获所有异常。分布式场景要考虑Seata等方案。
4.2 性能优化要点
4.2.1 连接池配置
Druid是目前最全面的连接池方案:
yaml复制spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 5
min-idle: 5
max-active: 20
test-on-borrow: true
validation-query: SELECT 1
4.2.2 二级缓存策略
MyBatis二级缓存配置:
xml复制<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
但生产环境建议:
- 使用Redis集中式缓存
- 对写多读少的数据禁用缓存
- 设置合理的TTL
5. 部署上线全流程
5.1 打包与瘦身
Maven打包插件关键配置:
xml复制<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>
使用分层构建减小Docker镜像体积:
dockerfile复制FROM adoptopenjdk:11-jre-hotspot as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
FROM adoptopenjdk:11-jre-hotspot
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
5.2 数据库迁移方案
推荐Flyway作为数据库版本管理工具:
xml复制<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
迁移脚本命名规范:
code复制V1__Initial_schema.sql
V2__Add_user_table.sql
6. 生产环境避坑指南
6.1 常见异常处理
-
MySQL连接超时:
yaml复制spring.datasource.druid.validation-query: SELECT 1 spring.datasource.druid.test-while-idle: true spring.datasource.druid.time-between-eviction-runs-millis: 60000 -
MyBatis参数映射错误:
- 检查#{xxx}与@Param名称是否一致
- 实体类属性与数据库字段映射关系
-
Spring循环依赖:
- 使用@Lazy延迟加载
- 重构代码结构
6.2 监控与调优
必备的Actuator配置:
yaml复制management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
endpoint:
health:
show-details: always
关键监控指标:
- 数据库连接池使用率
- HTTP请求耗时P99
- JVM内存使用情况
- GC频率和耗时
这套技术栈就像乐高积木,每个组件都有明确的职责边界。经过多个项目的验证,我发现遵循以下原则能少走弯路:保持Spring Boot的约定优于配置哲学、在MyBatis中坚持SQL显式优于隐式、利用Maven的依赖管理而非手动维护jar包、对MySQL要有适当的索引设计和查询优化意识。最近在实现一个复杂报表功能时,正是通过MyBatis的动态SQL结合MySQL的窗口函数,才避免了繁琐的Java代码处理。
