SpringBoot多数据源配置

492 阅读3分钟

在用springboot开发项目时,随着业务量的扩大,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,下面基于Spring-data-jpa配置多数据源,希望对大家有所帮助

项目目录结构

1、先在application.yml 中配置多个数据库

spring:
 datasource:
 database1:
 url: jdbc:mysql://localhost:3306/database1?useUnicode=true&characterEncoding=utf8
 username: root
 password: 12345678
 driverClassName: com.mysql.jdbc.Driver
 database2:
 url: jdbc:mysql://localhost:3306/database2?useUnicode=true&characterEncoding=utf8
 username: root
 password: 12345678
 driverClassName: com.mysql.jdbc.Driver
# type: com.alibaba.druid.pool.DruidDataSource
 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

这里配置了database1、database2两个数据库

2、配置数据库连接属性

在DataBase1Properties类中配置database1数据库连接的属性

@ConfigurationProperties(prefix = "spring.datasource.database1")
@Component
@Data
public class DataBase1Properties {
 private String url;
 private String username;
 private String password;
 private String driverClassName;
}

在DataBase2Properties类中配置database2数据库连接的属性

@ConfigurationProperties(prefix = "spring.datasource.database2")
@Component
@Data
public class DataBase2Properties {
 private String url;
 private String username;
 private String password;
 private String driverClassName;
}

3、数据库字段设置

在DataSourceConfig类中设置两个数据库的连接数据,在本文章中使用的是springboot2.0默认的Hikari连接,如果使用的是alibaba的druid,把HikariDataSource替换成DruidDataSource即可

@Configuration
@Slf4j
public class DataSourceConfig {
 @Autowired
 private DataBase1Properties dataBase1Properties;
 @Autowired
 private DataBase2Properties dataBase2Properties;
 @Bean(name = "dataBase1DataSource")
 @Primary
 public DataSource dataBase1DataSource(){
 log.info("dataBase1DataSource初始化----111111");
 HikariDataSource dataSource = new HikariDataSource();
 dataSource.setJdbcUrl(dataBase1Properties.getUrl());
 dataSource.setUsername(dataBase1Properties.getUsername());
 dataSource.setPassword(dataBase1Properties.getPassword());
 dataSource.setDriverClassName(dataBase1Properties.getDriverClassName());
 return dataSource;
 }
 @Bean(name = "dataBase2DataSource")
 public DataSource dataBase2DataSource(){
 log.info("dataBase2DataSource初始化----222222");
 HikariDataSource dataSource = new HikariDataSource();
 dataSource.setJdbcUrl(dataBase2Properties.getUrl());
 dataSource.setUsername(dataBase2Properties.getUsername());
 dataSource.setPassword(dataBase2Properties.getPassword());
 dataSource.setDriverClassName(dataBase2Properties.getDriverClassName());
 return dataSource;
 }
}

4、配置数据源、连接工厂、事物管理器、dao目录

在DataBaseConfig1类中

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
 entityManagerFactoryRef = "entityManagerFactoryDataBase1", // 配置连接工厂
 transactionManagerRef = "transactionManagerDatabase1", // 配置事物管理器
 basePackages = {"com.lss.dao.database1"} // 设置dao所在位置
)
public class DataBase1Config {
 // 配置数据源
 @Autowired
 private DataSource dataBase1DataSource;
 @Primary
 @Bean(name = "entityManagerFactoryDataBase1")
 public LocalContainerEntityManagerFactoryBean entityManagerFactoryDataBase1(EntityManagerFactoryBuilder builder) {
 return builder
 // 设置数据源
 .dataSource(dataBase1DataSource)
 //设置实体类所在位置.扫描所有带有 @Entity 注解的类
 .packages("com.lss.entity.database1")
 // 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());
 }
}

在DataBaseConfig2类中

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
 entityManagerFactoryRef = "entityManagerFactoryDataBase2", // 配置连接工厂
 transactionManagerRef = "transactionManagerDatabase2", // 配置事物管理器
 basePackages = {"com.lss.dao.database2"} // 设置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.lss.entity.database2")
 // 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());
 }
}

@Primary的意思是在众多相同的bean中,优先使用用@Primary注解的bean.而@Qualifier这个注解则指定某个bean有没有资格进行注入。

此时,多数据源的主要配置已经完成,下面是一些实体类、dao的常用配置

5、配置实体类,dao

在User、Student、UserDaoRepository、StudentDaoRepository四个类中分别配置如下

上面是最简单的类,就不贴代码了

6、数据库配置

分别创建两个数据库database1、database2,database1中创建tbl_user表,database2中创建tbl_student表,如下图

7、接口实现

在TestController.java中添加接口访问

@RestController
public class TestController {
 @Autowired
 private UserDaoRepository userDaoRepository;
 @Autowired
 private StudentDaoRepository studentDaoRepository;
 @GetMapping(value = "/getuser")
 public List<User> getuser(){
 List<User> all = userDaoRepository.findAll();
 return all;
 }
 @GetMapping(value = "/getstudent")
 public List<Student> getstudent(){
 List<Student> all = studentDaoRepository.findAll();
 return all;
 }
}

至此,所有的类都已经实现,启动项目

访问接口,数据如下