Skip to content

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_secret
java
@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
  • ← 返回 **返回 数据访问索引**

Knowledge4J — Java 知识库