Appearance
Spring 数据访问与数据库整合
企业级开发里,业务代码最终很少能绕开数据库访问,但真正的问题从来不只是“会不会写 SQL”。
数据访问这一条线真正要解决的是:
- 应用如何连接数据库
- SQL、事务、映射、连接池这些能力如何组织
JdbcTemplate、MyBatis、JPA这些方案分别适合什么场景- Spring 到底在数据库访问里提供了哪些统一能力
这篇文章主要负责建立一张总览图,把后续 MyBatis、事务、连接池、ORM 等专题串起来。
1. Spring 为什么要管数据访问
如果没有统一框架,数据库访问代码很容易散成这样:
- 到处自己获取连接
- 到处自己写提交和回滚
- SQL 执行和业务逻辑强耦合
- 异常处理风格不统一
Spring 在这里主要做两件事:
- 把数据访问的公共能力统一起来
- 把事务、连接、异常转换这些横切问题从业务代码里抽出去
所以 Spring 管数据访问,不是为了替你发明数据库,而是为了把数据库访问从零散低层操作收口成可维护的应用层模型。
2. 一条完整的数据访问链路通常包含什么
如果把企业应用里的数据库访问压缩成一条完整链路,通常会包括:
- 数据源
DataSource - 连接池
- 数据访问框架
- 事务管理
- 异常转换
- 领域对象或 DTO 映射
一次数据库访问,不只是“发一条 SQL”,而是连接、执行、映射、事务、异常、资源释放这一整套动作的组合。
3. DataSource 到底是什么
DataSource 可以理解成应用访问数据库连接的统一入口。
它解决的是:业务代码不要自己到处 new 连接,而要通过一个统一资源入口拿连接。
在 Spring 语境里,很多数据库访问能力最后都会建立在 DataSource 之上。
4. 连接池为什么属于数据访问主线
因为企业应用里几乎不可能每次访问数据库都现建现关一个连接。
连接池解决的是:把数据库连接复用起来,避免频繁创建销毁连接带来的成本和抖动。
所以数据访问这条线里,一个很常见的基础组合就是:
DataSource- 连接池
- 事务管理器
- 上层数据访问框架
5. Spring 常见的数据访问方式有哪些
在 Spring 生态里,最常见的几种方式通常是:
JdbcTemplateMyBatisJPA / HibernateSpring Data系列
它们不是简单的“新旧替代关系”,而是对 SQL 控制力、开发效率和对象映射抽象程度不同。
5.1 JdbcTemplate
它更适合保留 SQL 控制力,同时减少原始 JDBC 的模板代码。
5.2 MyBatis
它更适合希望自己掌控 SQL,但又不想手写太多 JDBC 样板代码。
5.3 JPA / Hibernate
它更适合更偏对象模型驱动,希望由 ORM 帮你管理实体映射和常见持久化操作。
6. JdbcTemplate 到底解决什么问题
原始 JDBC 最大的问题之一,是模板代码太重:
- 获取连接
- 创建语句
- 执行 SQL
- 遍历结果集
- 关闭资源
JdbcTemplate 的价值在于:把这些重复模板动作收口,让你更聚焦 SQL 和结果处理。
例如:
java
@Repository
public class UserJdbcRepository {
private final JdbcTemplate jdbcTemplate;
public UserJdbcRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public User findById(Long id) {
return jdbcTemplate.queryForObject(
"select id, name from user where id = ?",
(rs, rowNum) -> new User(rs.getLong("id"), rs.getString("name")),
id);
}
}7. 为什么很多项目会在 MyBatis 和 JPA 之间纠结
因为它们代表的是两种很不一样的思路。
7.1 MyBatis
核心特点是:SQL 由开发者自己掌控。
适合 SQL 较复杂、对查询控制要求高的场景。
7.2 JPA
核心特点是:更强调实体模型和对象关系映射。
适合标准增删改查较多、希望提升通用开发效率的场景。
MyBatis更偏 SQL 驱动JPA更偏对象模型驱动
8. Spring 在数据访问里提供了哪些统一能力
这部分一定要单独讲清楚。
Spring 不同数据访问框架之上,常见的统一能力主要包括:
- 数据源管理
- 事务管理
- 异常转换
- 依赖注入与配置整合
8.1 事务管理
这是最核心的一条。
无论底层是 JdbcTemplate、MyBatis 还是 JPA,Spring 都能把事务边界统一收口到应用层。
8.2 异常转换
Spring 会把很多底层数据访问异常转换成更统一的异常体系,便于上层统一处理。
8.3 配置整合
通过 Spring Boot,很多数据源、事务和访问框架的接入会更简单。
9. 数据访问相关常见注解和组件
| 注解 / 组件 | 作用 |
|---|---|
@Repository | 标记数据访问层组件 |
@Transactional | 声明事务边界 |
DataSource | 统一数据库连接入口 |
JdbcTemplate | 简化 JDBC 模板代码 |
PlatformTransactionManager | 统一事务管理抽象 |
例如:
java
@Repository
public class OrderRepository {
private final JdbcTemplate jdbcTemplate;
public OrderRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public int updateStatus(Long id, String status) {
return jdbcTemplate.update(
"update orders set status = ? where id = ?",
status, id);
}
}10. 企业里最常见的数据访问组合长什么样
比较常见的组合通常是:
Spring Boot + HikariCP + MyBatisSpring Boot + HikariCP + JPASpring Boot + JdbcTemplate
为什么会有这些组合?
因为企业应用真正要做的,不是只选一个技术名词,而是把:
- 连接池
- 数据访问框架
- 事务管理
- 配置管理
这几件事一起拼成一套稳定方案。
11. 工程上最容易混的几个边界
11.1 误区一:数据访问框架只是在替你发 SQL
不只是。
它还涉及对象映射、异常处理、资源管理和与事务的协同。
11.2 误区二:只要有 ORM,就不需要理解 SQL
不是。
企业场景里性能、索引、复杂查询、批量写入这些问题,仍然离不开 SQL 基础。
11.3 误区三:连接池、事务、ORM 是三个不相关的话题
它们在真实应用里是紧密耦合的一条链路。
12. 推荐继续阅读
从这篇继续往下读,比较自然的顺序通常是:
- 看 Spring 事务详解
- 再看 MyBatis
- 再结合 MySQL 里的连接池、并发读写和 SQL 场景专题一起理解
13. 一句话总结
Spring 数据访问这条线,本质上是在解决应用如何以统一方式组织数据源、连接池、事务、SQL 执行和对象映射;而企业开发里真正关键的,不是只选某个框架名,而是把这整条链路设计稳。