06.3 — JdbcTemplate 与多数据源
定位: Spring JDBC 操作方式和多数据源配置实战 面试高频度: ⭐⭐⭐ 考查方式: JdbcTemplate 使用、多数据源配置注意点
一、这是什么?为什么需要它?
JdbcTemplate 是 Spring 对 JDBC 的轻量级封装,消除资源管理样板代码。多数据源配置让应用同时连接多个数据库(主从、读写分离)。
二、原理拆解
2.1 JdbcTemplate
java
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<User> findAll() {
return jdbcTemplate.query(
"SELECT * FROM users",
(rs, rowNum) -> new User(
rs.getLong("id"),
rs.getString("name"))
);
}
public Optional<User> findById(Long id) {
return jdbcTemplate.query(
"SELECT * FROM users WHERE id = ?",
new BeanPropertyRowMapper<>(User.class),
id
).stream().findFirst();
}
}JdbcClient(Spring Boot 3.1+)
java
@Repository
public class UserDao {
@Autowired
private JdbcClient jdbcClient;
public List<User> findAll() {
return jdbcClient.sql("SELECT * FROM users")
.query(User.class)
.list();
}
}2.2 多数据源配置
yaml
spring:
datasource:
primary:
url: jdbc:mysql://localhost:3306/main_db
username: root
password: secret
secondary:
url: jdbc:mysql://localhost:3306/audit_db
username: readonly
password: readonly_secretjava
@Configuration
public class PrimaryDataSourceConfig {
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "primaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier("primaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.domain.primary")
.persistenceUnit("primary")
.build();
}
}三、面试视角
| 追问 | 答案要点 |
|---|---|
| JdbcTemplate 和 JPA 优缺点? | JdbcTemplate 轻量灵活但手动映射,JPA 自动映射但学习曲线高 |
| 多数据源配置注意事项? | 需要 @Primary 区分主数据源,每个数据源需独立配置 EntityManagerFactory 和 TransactionManager |
| JdbcClient 比 JdbcTemplate 好在哪? | 链式 API、自动参数绑定、查询结果自动映射 |
📚 相关链接
- **Spring Data JPA** — ORM 方式数据访问
- **Spring Boot** — 自动配置 DataSource
- ← 返回 **返回 数据访问索引**