You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中JpaRepository默认使用什么数据库?如何修改默认数据源?

默认数据库选择逻辑

直接调用JpaRepository内置的save、findById、findAll等方法时,Spring Data JPA默认会绑定Spring上下文中标记为@Primary的主数据源执行操作,具体的数据库选择遵循Spring Boot自动配置规则:

  • 如果你没有引入任何外部数据库驱动、也没有手动配置数据源,框架会自动检测classpath下的嵌入式内存数据库驱动,优先级从高到低为H2、HSQLDB、Derby,默认会自动创建连接到H2的内存数据源作为主库,数据会在应用重启后清空。
  • 如果你引入了MySQL、PostgreSQL等外部数据库驱动,但没有配置对应的连接参数,应用启动时会直接抛出数据源缺失的异常,不会自动选择默认数据库。

你给出的示例代码中,@Repository注解其实不是必须的,Spring Data JPA会自动扫描继承了JpaRepository的接口并完成注册,添加该注解不会影响逻辑。

@Repository
// Interface
public interface FooRepository
    extends JpaRepository<Department, Long> {
}
修改默认关联数据库的方法

根据业务场景不同,分两种配置方式:

场景1:单数据源,直接替换默认连接的数据库

这是最常见的场景,不需要写额外的配置类,直接修改application.yml(或application.properties)中的主数据源配置即可,配置完成后所有JpaRepository默认都会连接该配置指定的数据库。以连接MySQL为例,配置示例如下:

spring:
  datasource:
    # 改成你自己的业务数据库连接地址
    url: jdbc:mysql://localhost:3306/your_custom_biz_db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
    username: your_db_username
    password: your_db_password
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

场景2:多数据源,给不同Repository指定不同数据库

如果业务需要连接多个数据库,需要手动配置不同的数据源、实体管理器、事务管理器,再通过包路径扫描把对应Repository绑定到指定的数据源上。比如要让上面的FooRepository连接独立的业务库、其他Repository走默认库,配置步骤如下:

  1. 编写主数据源配置类,标记为@Primary作为默认数据源,指定默认扫描的Repository和实体包路径:
@Configuration
@EnableJpaRepositories(
    basePackages = "com.example.repo.primary", // 主库对应的Repository存放包
    entityManagerFactoryRef = "primaryEntityManagerFactory",
    transactionManagerRef = "primaryTransactionManager"
)
public class PrimaryDataSourceConfig {
    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder, DataSource primaryDataSource) {
        return builder
                .dataSource(primaryDataSource)
                .packages("com.example.entity.primary") // 主库对应的实体类存放包
                .persistenceUnit("primaryPU")
                .build();
    }

    @Primary
    @Bean
    public PlatformTransactionManager primaryTransactionManager(LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory) {
        return new JpaTransactionManager(primaryEntityManagerFactory.getObject());
    }
}
  1. 编写业务库数据源配置类,指定FooRepository所在的包路径,绑定到业务数据源:
@Configuration
@EnableJpaRepositories(
    basePackages = "com.example.repo.biz", // FooRepository就存放在这个包下
    entityManagerFactoryRef = "bizEntityManagerFactory",
    transactionManagerRef = "bizTransactionManager"
)
public class BizDataSourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.biz")
    public DataSource bizDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean bizEntityManagerFactory(EntityManagerFactoryBuilder builder, DataSource bizDataSource) {
        return builder
                .dataSource(bizDataSource)
                .packages("com.example.entity.biz") // 业务库对应的实体类存放包
                .persistenceUnit("bizPU")
                .build();
    }

    @Bean
    public PlatformTransactionManager bizTransactionManager(LocalContainerEntityManagerFactoryBean bizEntityManagerFactory) {
        return new JpaTransactionManager(bizEntityManagerFactory.getObject());
    }
}
  1. 在配置文件中添加两个数据源的连接参数:
spring:
  datasource:
    primary:
      url: jdbc:mysql://localhost:3306/default_db
      username: root
      password: db_pwd_1
      driver-class-name: com.mysql.cj.jdbc.Driver
    biz:
      url: jdbc:mysql://localhost:3306/foo_biz_db
      username: root
      password: db_pwd_2
      driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update

配置完成后,com.example.repo.biz包下的FooRepository调用内置方法时会自动连接foo_biz_db,其他包下的Repository默认连接default_db。

注意:多数据源配置时,必须指定其中一个数据源为@Primary,否则Spring会因找到多个同类型Bean抛出注入异常。


内容的提问来源于stack exchange,提问作者postFix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:40:36