本贴主要讲解配置多数据源
springboot+jpa的整合需要自行准备好
-
-
org.springframework.boot -
spring-boot-starter-data-jdbc -
-
-
org.springframework.boot -
spring-boot-starter-data-jpa -
-
-
-
com.oracle -
ojdbc6 -
11.2.0.3 -
system -
${xxx}/src/main/webapp/WEB-INF/lib/ojdbc6-11.2.0.3.jar -
-
-
com.oracle -
ojdbc6 -
11.1.0.7.0 -
system -
${xxx}/src/main/webapp/WEB-INF/lib/ojdbc6.jar -
-
-
com.oracle -
ojdbc5 -
11.1.0.7.0 -
system -
${xxx}/src/main/webapp/WEB-INF/lib/ojdbc5.jar -
-
-
-
-
com.microsoft.sqlserver -
sqljdbc4 -
4.0.0 -
- spring:
- datasource:
- database1:
- # --------------- Oracle -----------------#
- driver-class-name: oracle.jdbc.OracleDriver
- url: jdbc:oracle:thin:@IP:端口:数据库
- username: xxxx
- password: xxxx
- database2:
- # --------------- SQL Server -----------------#
- driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
- url: jdbc:sqlserver://localhost:1433;DatabaseName=数据库
- username: xxxx
- password: xxxx
-
- #配置 Jpa
- jpa:
- database: mysql
- show-sql: true
- hibernate:
- ddl-auto: update
- naming:
- physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
- database-platform: org.hibernate.dialect.MySQL5Dialect
3.1 创建DataSourceConfig文件
- import com.zaxxer.hikari.HikariDataSource;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.context.annotation.Primary;
-
- import javax.sql.DataSource;
-
- /**
- * 多数据源连接
- */
- @Configuration
- @Slf4j
- public class DataSourceConfig {
-
-
- @Autowired
- private DataBase1Properties dataBase1Properties;
-
- @Autowired
- private DataBase2Properties dataBase2Properties;
-
- @Bean(name = "dataBase1DataSource")
- @Primary
- public DataSource dataBase1DataSource(){
- log.info("dataBase1DataSource初始化开始");
- HikariDataSource dataSource = new HikariDataSource();
- dataSource.setJdbcUrl(dataBase1Properties.getUrl());
- dataSource.setUsername(dataBase1Properties.getUsername());
- dataSource.setPassword(dataBase1Properties.getPassword());
- dataSource.setDriverClassName(dataBase1Properties.getDriverClassName());
- log.info("dataBase1DataSource初始化成功");
- return dataSource;
- }
-
- @Bean(name = "dataBase2DataSource")
- public DataSource dataBase2DataSource(){
- log.info("dataBase2DataSource初始化开始");
- HikariDataSource dataSource = new HikariDataSource();
- dataSource.setJdbcUrl(dataBase2Properties.getUrl());
- dataSource.setUsername(dataBase2Properties.getUsername());
- dataSource.setPassword(dataBase2Properties.getPassword());
- dataSource.setDriverClassName(dataBase2Properties.getDriverClassName());
- log.info("dataBase2DataSource初始化成功");
- return dataSource;
- }
- }
3.2创建DataBase1Config
-
- import org.springframework.beans.factory.annotation.Autowired;
- 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.sql.DataSource;
-
- @Configuration
- @EnableTransactionManagement
- @EnableJpaRepositories(
- entityManagerFactoryRef = "entityManagerFactoryDataBase1", // 配置连接工厂
- transactionManagerRef = "transactionManagerDatabase1", // 配置事物管理器
- basePackages = {"com.dao.primary"} // 设置dao所在位置
- )
- public class DataBase1Config {
-
- // 配置数据源
- @Autowired
- private DataSource dataBase1DataSource;
-
- @Primary
- @Bean(name = "entityManagerFactoryDataBase1")
- public LocalContainerEntityManagerFactoryBean entityManagerFactoryDataBase1(EntityManagerFactoryBuilder builder) {
- return builder
- // 设置数据源
- .dataSource(dataBase1DataSource)
- //设置实体类所在位置.扫描所有带有 @Entity 注解的类
- .packages("com.domain.entity.primary")
- // Spring会将EntityManagerFactory注入到Repository之中.有了 EntityManagerFactory之后,
- // Repository就能用它来创建 EntityManager 了,然后 EntityManager 就可以针对数据库执行操作
- .persistenceUnit("database1PersistenceUnit")
- .build();
-
- }
-
- /**
- * 配置事物管理器
- *
- * @param builder
- * @return
- */
- @Bean(name = "transactionManagerDatabase1")
- PlatformTransactionManager transactionManagerDatabase1(EntityManagerFactoryBuilder builder) {
- return new JpaTransactionManager(entityManagerFactoryDataBase1(builder).getObject());
- }
- }
3.3创建DataBase2Config
-
- 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.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.sql.DataSource;
-
- @Configuration
- @EnableTransactionManagement
- @EnableJpaRepositories(
- entityManagerFactoryRef = "entityManagerFactoryDataBase2", // 配置连接工厂
- transactionManagerRef = "transactionManagerDatabase2", // 配置事物管理器
- basePackages = {"com.dao.secondary"} // 设置dao所在位置
- )
- public class DataBase2Config {
-
- // 配置数据源
- @Autowired
- @Qualifier("dataBase2DataSource")
- private DataSource dataBase2DataSource;
-
- @Bean(name = "entityManagerFactoryDataBase2")
- public LocalContainerEntityManagerFactoryBean entityManagerFactoryDataBase2(EntityManagerFactoryBuilder builder) {
- return builder
- // 设置数据源
- .dataSource(dataBase2DataSource)
- //设置实体类所在位置.扫描所有带有 @Entity 注解的类
- .packages("com.domain.entity.secondary")
- // Spring会将EntityManagerFactory注入到Repository之中.有了 EntityManagerFactory之后,
- // Repository就能用它来创建 EntityManager 了,然后 EntityManager 就可以针对数据库执行操作
- .persistenceUnit("database2PersistenceUnit")
- .build();
-
- }
-
- /**
- * 配置事物管理器
- *
- * @param builder
- * @return
- */
- @Bean(name = "transactionManagerDatabase2")
- PlatformTransactionManager transactionManagerDatabase2(EntityManagerFactoryBuilder builder) {
- return new JpaTransactionManager(entityManagerFactoryDataBase2(builder).getObject());
- }
- }
3.4创建DataBase1Properties
- import lombok.Data;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.stereotype.Component;
-
- @ConfigurationProperties(prefix = "spring.datasource.database1")
- @Component
- @Data
- public class DataBase1Properties {
- private String url;
-
- private String username;
-
- private String password;
-
- private String driverClassName;
- }
3.5创建DataBase2Properties
- import lombok.Data;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.stereotype.Component;
-
- @ConfigurationProperties(prefix = "spring.datasource.database2")
- @Component
- @Data
- public class DataBase2Properties {
- private String url;
-
- private String username;
-
- private String password;
-
- private String driverClassName;
- }
例如
- package com.domain.entity.secondary;
-
-
- import lombok.Data;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.Id;
- import javax.persistence.Table;
- import java.io.Serializable;
-
- @Data
- @Entity
- @Table(name="t_user")
- public class TUser implements Serializable, Cloneable {
-
- @Id
- @Column(name = "id")
- private Integer id;
-
- @Column(name = "name")
- private String name;
-
-
- }
例如
- package com.dao.secondary;
-
- import org.springframework.data.jpa.repository.JpaRepository;
- import org.springframework.stereotype.Repository;
- import java.util.List;
-
- @Repository
- public class TUserDAO extends JpaRepository
{ -
- @Query(value = "select * from aa where c_empoid = :empId", nativeQuery = true)
- List
-
- }
重点需要注意的是要把两个数据源的代码做好区分,例如
数据源1的实体都放com.domain.entity.primary
数据源2的实体都放com.domain.entity.secondary
DAO层也是要做好区分