SpringBoot JPA配置多数据源(同类型库)教程


SpringBoot项目配置多数据源主要分为以下个步骤:

确定好所连接的数据库的资源(包括url username password)
将两个库的信息写入到配置文件中(application.yaml或application.properties都可)
我使用的是两个mysql的数据库,连接信息如下:
 spring:
  datasource:
    ds1:
      jdbc-url: xxxx
      #数据库用户名
      username: xxxx
      #数据库密码
      password:xxxx
      #mysql数据库驱动程序(重要)
      driver-class-name: com.mysql.cj.jdbc.Driver
    ds2:
      jdbc-url: xxxx
      #数据库用户名
      username: xxxxx
      #数据库密码
      password: xxxxxx
      #mysql数据库驱动程序(重要)
      driver-class-name: com.mysql.cj.jdbc.Driver

写完配置文件后,需要根据使用的数据源来建立不同的数据源配置类
首先建立主配置类DataSourceConfig.class,在主配置类中指定刚刚写入的两个数据源,如下:
@Configuration
public class DataSourceConfig {

    //第一个数据源
    @Bean(name = "firstDataSource")
    @Primary
    @ConfigurationProperties("spring.datasource.ds1")
    @Qualifier("firstDataSource")
    public DataSource FirstDataSource() {
        return DataSourceBuilder.create().build();
    }

    //第二个数据源
    @Bean(name = "secondDataSource")
    @ConfigurationProperties("spring.datasource.ds2")
    @Qualifier("secondDataSource")
    public DataSource SecondDataSource() {
        return DataSourceBuilder.create().build();
    }

    //加载JPA的相关配置信息
    @Autowired
    private JpaProperties jpaProperties;
    @Autowired
    private HibernateProperties hibernateProperties;

    @Bean(name = "vendorProperties")
    public Map<String, Object> getVendorProperties() {
        return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
    }

}


其次,建立主数据源配置类,需要指定与该数据源建立连接的**实体类包**与持久层的**repository接口的包**
1
@Configuration  //定义主配置类,在启动时注入bean到spring容器中
@EnableTransactionManagement //开启生明式事务
@EnableJpaRepositories( //用来扫描指定的包及其子包中repository定义
        entityManagerFactoryRef="entityManagerFactoryPrimary", 
        transactionManagerRef="transactionManagerPrimary",
        basePackages= { "xxx.xxx.xxx.xx" })//设置dao层(持久层,即repo)所在位置
public class PrimaryDataSourceConfig {

    @Resource
    @Qualifier("firstDataSource")
    private DataSource firstDataSource; //注入主配置类中的主数据源

    @Resource
    @Qualifier("vendorProperties")
    private Map<String, Object> vendorProperties; //jpa加载的相关配置,去掉也可以

    @Bean(name = "entityManagerFactoryPrimary")
    @Primary //主数据源中要加这个
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.MYSQL);
        vendorAdapter.setShowSql(true);
        
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("xxx.xxx.xxx.xxx"); //设置实体类包所在位置
        factory.setDataSource(firstDataSource); //指定数据源
        factory.setJpaPropertyMap(vendorProperties);

        return factory;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
        return transactionManager;
    }

}

这里需要注意的是,几个重要的注解,@Configuration、@EnableJpaRepositories与@Primary不能忘记。
1
下一步,建立第二个数据源的配置类,需要指定的东西与主数据源完全相同,只不过要去掉@Primary的注解

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef="entityManagerFactorySecondary",
        basePackages= { "=com.xxx.xxx.repo" })//设置dao(repo)所在位置
public class SecondaryDataSourceConfig {

    @Resource
    @Qualifier("secondDataSource")
    private DataSource secondDataSource; //注入第二个数据源

    @Resource
    @Qualifier("vendorProperties")
    private Map<String, Object> vendorProperties;

    @Bean(name = "entityManagerFactorySecondary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory () {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.MYSQL);
        vendorAdapter.setShowSql(true);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("com.xxx.xxx.entity"); //指定实体类所在包位置
        factory.setDataSource(secondDataSource); //指定数据源
        factory.setJpaPropertyMap(vendorProperties);

        return factory;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
        return transactionManager;
    }

}

基本配置已完成,不需要再做其他配置,也不需要修改其他层的代码,接下来就是编写测试代码。

首先建立两个数据源对应的实体类与持久层接口以及业务层接口及其实现,然后生成测试代码,查询库中表数据。

查询成功

 

多数据源配置结束!
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值