学习Spring Boot Jpa多数据源配置
今天项目经理让我学习一哈配置多数据源,一天的时间啊
引入依赖
<!--数据库监控-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>
<!--数据库监控-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
修改配置文件
datasource:
datamanager:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhsot:3306/datamanager?characterEncoding=utf8&useSSL=false
username: root
password: root
businessmanager:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhsot:3306/businessmanager?characterEncoding=utf8&useSSL=false
username: root
password: root
配置数据源
收件在DataSourceConfig配置类中定义两个数据源,同时为每一个数据源创建一个JdbcTemplate。
package com.xfdc.exercise.config;
import org.springframework.beans.factory.annotation.Qualifier;
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;
/**
* @author Administrator
* 多数据源配置类
*/
@Configuration
public class DataSourceConfig {
/**
* 数据源1 主数据源
*/
@Primary
@Bean(name = "datamanagerDataSource")
@Qualifier("datamanagerDataSource")//spring.datasource.primary
@ConfigurationProperties(prefix = "spring.datasource.datamanager")
public DataSource datamanagerDatasource(){
return DataSourceBuilder.create().build();
}
/**
* 数据源2
* @return
*/
@Bean(name = "businessmanagerDataSource")
@Qualifier("businessmanagerDataSource")
@ConfigurationProperties(prefix = "spring.datasource.businessmanager")
public DataSource businessmanagerDataSource(){
return DataSourceBuilder.create().build();
}
}
这样就相当于告诉程序,程序要用到两个数据库,于是程序就去连接这两个数据库。怎么连接呢,默认的连接已经行不通了,因此,对于每个数据库还需要有一个定义文件告诉程序如何去连接它。
package com.xfdc.exercise.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
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.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;
/**
* @author Administrator
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactorybusinessmanager",
transactionManagerRef = "transactionManagerbusinessmanager",
basePackages = {"com.xfdc.exercise.repository.businessmanager"})
public class BusinessmanagerConfig {
@Autowired
private JpaProperties jpaProperties;
@Autowired
@Qualifier("businessmanagerDataSource")
private DataSource businessmanagerDataSource;
@Autowired
private HibernateProperties hibernateProperties;
@Bean(name ="entityManagerbusinessmanager")
public EntityManager entityManager(EntityManagerFactoryBuilder builder){
return entityManagerFactorybusinessmanager(builder).getObject().createEntityManager();
}
@Bean(name = "entityManagerFactorybusinessmanager")
public LocalContainerEntityManagerFactoryBean entityManagerFactorybusinessmanager(
EntityManagerFactoryBuilder builder){
return builder
.dataSource(businessmanagerDataSource)
.packages("com.xfdc.exercise.entity.businessmanager")
.persistenceUnit("businessmanagerPersistenceUnit")
.properties(getVendorProperties())
.build();
}
private Map<String,Object> getVendorProperties() {
return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties()
,new HibernateSettings());
}
@Bean(name ="transactionManagerbusinessmanager")
public PlatformTransactionManager transactionManagerbusinessmanager(EntityManagerFactoryBuilder builder){
return new JpaTransactionManager(entityManagerFactorybusinessmanager(builder).getObject());
}
}
package com.xfdc.exercise.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
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.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;
/**
* @author Administrator
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactorydatamanager",
transactionManagerRef = "transactionManagerdatamanager",
basePackages = {"com.xfdc.exercise.repository.datamanager"})
public class DatamanagerConfig {
@Autowired
private JpaProperties jpaProperties;
@Autowired
@Qualifier("datamanagerDataSource")
private DataSource datamanagerDataSource;
@Autowired
private HibernateProperties hibernateProperties;
@Primary
@Bean(name ="entityManagerdatamanager")
public EntityManager entityManager(EntityManagerFactoryBuilder builder){
return entityManagerFactorydatamanager(builder).getObject().createEntityManager();
}
@Primary
@Bean(name = "entityManagerFactorydatamanager")
public LocalContainerEntityManagerFactoryBean entityManagerFactorydatamanager(
EntityManagerFactoryBuilder builder){
return builder
.dataSource(datamanagerDataSource)
.packages("com.xfdc.exercise.entity.datamanager")
.persistenceUnit("datamanagerPersistenceUnit")
.properties(getVendorProperties())
.build();
}
private Map<String,Object> getVendorProperties() {
return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties()
,new HibernateSettings());
}
@Primary
@Bean(name ="transactionManagerdatamanager")
public PlatformTransactionManager transactionManagerdatamanager(EntityManagerFactoryBuilder builder){
return new JpaTransactionManager(entityManagerFactorydatamanager(builder).getObject());
}
}