闲来无事,在网上查找资料,练习配置多数据源,成功之后,写此博客记录一下。
已上传至码云: 源码地址
技术点:SpringBoot+JPA+Mysql
一、application.yml文件配置
spring:
jpa:
hibernate:
ddl-auto: create
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
open-in-view: true
show-sql: true
generate-ddl: true
datasource:
primary:
jdbc-url: jdbc
:mysql
://127.0.0.1
:3306/test
?characterEncoding=utf8
&useSSL=false
&serverTimezone=Asia/Shanghai
username: root
password: 123456
secondary:
jdbc-url: jdbc
:mysql
://127.0.0.1
:3306/test2
?characterEncoding=utf8
&useSSL=false
&serverTimezone=Asia/Shanghai
username: root
password: 123456
server:
port: 8888
二、读取yml配置数据,注入IOC中
package com
.example
.demo
.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
;
@Configuration
public class DataSourceConfig {
@Bean(name
= "primaryDataSource")
@Qualifier("primaryDataSource")
@Primary
@ConfigurationProperties(prefix
= "spring.datasource.primary")
public DataSource
primaryDataSource() {
return DataSourceBuilder
.create().build();
}
@Bean(name
= "secondaryDataSource")
@Qualifier("secondaryDataSource")
@ConfigurationProperties(prefix
= "spring.datasource.secondary")
public DataSource
secondaryDataSource() {
return DataSourceBuilder
.create().build();
}
}
三、配置类(数据源1)
package com
.example
.demo
.config
;
import org
.springframework
.beans
.factory
.annotation
.Autowired
;
import org
.springframework
.beans
.factory
.annotation
.Qualifier
;
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
.core
.env
.Environment
;
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
.HashMap
;
import java
.util
.Map
;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef
= "entityManagerFactoryPrimary",
transactionManagerRef
= "transactionManagerPrimary",
basePackages
= {"com.example.demo.test.dao"})
public class PrimaryConfig {
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource
;
@Primary
@Bean(name
= "entityManagerPrimary")
public EntityManager
entityManager(EntityManagerFactoryBuilder builder
) {
return entityManagerFactoryPrimary(builder
).getObject().createEntityManager();
}
@Primary
@Bean(name
= "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean
entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder
) {
return builder
.dataSource(primaryDataSource
)
.properties(getVendorProperties())
.packages("com.example.demo.test.po")
.persistenceUnit("primaryPersistenceUnit")
.build();
}
private Map
getVendorProperties() {
HashMap
<String, Object> properties
= new HashMap<>();
properties
.put("hibernate.dialect",
env
.getProperty("hibernate.dialect"));
properties
.put("hibernate.ddl-auto",
"create");
properties
.put("hibernate.physical_naming_strategy",
"org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
properties
.put("hibernate.implicit_naming_strategy",
"org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
return properties
;
}
@Autowired
private Environment env
;
@Primary
@Bean(name
= "transactionManagerPrimary")
public PlatformTransactionManager
transactionManagerPrimary(EntityManagerFactoryBuilder builder
) {
return new JpaTransactionManager(entityManagerFactoryPrimary(builder
).getObject());
}
}
四、配置类(数据源2)
package com
.example
.demo
.config
;
import org
.springframework
.beans
.factory
.annotation
.Autowired
;
import org
.springframework
.beans
.factory
.annotation
.Qualifier
;
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
.core
.env
.Environment
;
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
.HashMap
;
import java
.util
.Map
;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef
= "entityManagerFactorySecondary",
transactionManagerRef
= "transactionManagerSecondary",
basePackages
= {"com.example.demo.test2.dao"})
public class SecondaryConfig {
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource
;
@Bean(name
= "entityManagerSecondary")
public EntityManager
entityManager(EntityManagerFactoryBuilder builder
) {
return entityManagerFactorySecondary(builder
).getObject().createEntityManager();
}
@Bean(name
= "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean
entityManagerFactorySecondary(EntityManagerFactoryBuilder builder
) {
return builder
.dataSource(secondaryDataSource
)
.properties(getVendorProperties())
.packages("com.example.demo.test2.po")
.persistenceUnit("primaryPersistenceUnit")
.build();
}
private Map
getVendorProperties() {
HashMap
<String, Object> properties
= new HashMap<>();
properties
.put("hibernate.hbm2ddl.auto",
env
.getProperty("hibernate.hbm2ddl.auto"));
properties
.put("hibernate.ddl-auto",
env
.getProperty("update"));
properties
.put("hibernate.dialect",
env
.getProperty("hibernate.dialect"));
properties
.put("hibernate.physical_naming_strategy",
"org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
properties
.put("hibernate.implicit_naming_strategy",
"org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
return properties
;
}
@Autowired
private Environment env
;
@Bean(name
= "transactionManagerSecondary")
PlatformTransactionManager
transactionManagerSecondary(EntityManagerFactoryBuilder builder
) {
return new JpaTransactionManager(entityManagerFactorySecondary(builder
).getObject());
}
}
之后就可以根据相应的mapper文件操作不同的数据库了!
完成!!!
参考博客