【SpringBoot学习笔记】配置多数据源

最近项目需要又重新复习了下springboot,关于springboot配置多数据源,做了笔记,分享给有需要的小伙伴们,视频看的动力节点王鹤老师讲的,
【【SpringBoot学习笔记】配置多数据源】动力节点王鹤老师讲解的springboot教程,由浅入深,带你体验Spring Boot的极速开发过程,内容丰富,涵盖了SpringBoot开发的方方面面,并且同步更新到Spring Boot 2.x系列的最新版本。
视频链接:
https://www.bilibili.com/vide...
一、目录结构 目录结构
【SpringBoot学习笔记】配置多数据源
文章图片

二、依赖包(pom.xml)

org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-jpa mysql mysql-connector-java org.springframework.boot spring-boot-configuration-processor true org.projectlombok lombok 1.18.2

三、配置文件
server: port: 8080 spring: datasource: first: driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/first?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true username: root password: root second: driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/second?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true username: root password: root jpa: hibernate: ddl-auto: update naming: physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy show-sql: true database-platform: org.hibernate.dialect.MySQL5InnoDBDialect database: mysql

四、多数据源配置(jpa) 1. DataSourceConfiguration
package com.cetc.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; /** * 数据库配置 */ @Configuration public class DataSourceConfiguration {/** *第一个数据连接,默认优先级最高 * @return */ @Bean(name = "dataSourceFirst") @Primary @ConfigurationProperties(prefix = "spring.datasource.first") public DataSource dataSourceFirst() { //这种方式的配置默认只满足spring的配置方式,如果使用其他数据连接(druid),需要自己独立获取配置 return DataSourceBuilder.create().build(); }/** * 第二个数据源 * @return */ @Bean(name = "dataSourceSecond") @ConfigurationProperties(prefix = "spring.datasource.second") public DataSource dataSourceSecond() { return DataSourceBuilder.create().build(); } }

说明:其实这里配置已经完成了,这里就配置了两个数据源了。可以加入对应的JdbcTemplate,这里不做介绍,比较简单
2. JpaFirstConfiguration
package com.cetc.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.persistence.EntityManager; import javax.sql.DataSource; /** * 第一个数据源,jpa的相关配置 */ @Configuration @EntityScan(basePackages = "com.cetc.domain.first") //1、实体扫描 //2、实体管理ref //3、事务管理 @EnableJpaRepositories( basePackages = "com.cetc.repository.first", entityManagerFactoryRef = "firstEntityManagerFactoryBean", transactionManagerRef = "firstTransactionManager") @EnableTransactionManagement public class JpaFirstConfiguration {//第一个数据源,可以不加Qualifier @Autowired @Qualifier("dataSourceFirst") private DataSource dataSource; //jpa其他参数配置 @Autowired private JpaProperties jpaProperties; //实体管理工厂builder @Autowired private EntityManagerFactoryBuilder factoryBuilder; /** * 配置第一个实体管理工厂的bean * @return */ @Bean(name = "firstEntityManagerFactoryBean") @Primary public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { return factoryBuilder.dataSource(dataSource) //这一行的目的是加入jpa的其他配置参数比如(ddl-auto: update等) //当然这个参数配置可以在事务配置的时候也可以 .properties(jpaProperties.getHibernateProperties(new HibernateSettings())) .packages("com.cetc.domain.first") .persistenceUnit("firstPersistenceUnit") .build(); }/** * EntityManager不过解释,用过jpa的应该都了解 * @return */ @Bean(name = "firstEntityManager") @Primary public EntityManager entityManager() { return entityManagerFactoryBean().getObject().createEntityManager(); }/** * jpa事务管理 * @return */ @Bean(name = "firstTransactionManager") @Primary public JpaTransactionManager transactionManager() { JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(); jpaTransactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject()); return jpaTransactionManager; } }

3. JpaSecondConfiguration
package com.cetc.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.persistence.EntityManager; import javax.sql.DataSource; /** * 第二个数据源,jpa的相关配置 */ @Configuration @EntityScan(basePackages = "com.cetc.domain.second") //1、实体扫描 //2、实体管理ref //3、事务管理 @EnableJpaRepositories( basePackages = "com.cetc.repository.second", entityManagerFactoryRef = "secondEntityManagerFactoryBean", transactionManagerRef = "secondTransactionManager") @EnableTransactionManagement public class JpaSecondConfiguration {//第二个数据源,必须加Qualifier @Autowired @Qualifier("dataSourceSecond") private DataSource dataSource; //jpa其他参数配置 @Autowired private JpaProperties jpaProperties; //实体管理工厂builder @Autowired private EntityManagerFactoryBuilder factoryBuilder; /** * 配置第二个实体管理工厂的bean * @return */ @Bean(name = "secondEntityManagerFactoryBean") public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { return factoryBuilder.dataSource(dataSource) .properties(jpaProperties.getHibernateProperties(new HibernateSettings())) .packages("com.cetc.domain.second") .persistenceUnit("secondPersistenceUnit") .build(); }/** * EntityManager不过解释,用过jpa的应该都了解 * @return */ @Bean(name = "secondEntityManager") public EntityManager entityManager() { return entityManagerFactoryBean().getObject().createEntityManager(); }/** * jpa事务管理 * @return */ @Bean(name = "secondTransactionManager") public JpaTransactionManager transactionManager() { JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(); jpaTransactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject()); return jpaTransactionManager; } }

    推荐阅读