0
点赞
收藏
分享

微信扫一扫

SpringBoot 配置多数据源 JPA

RockYoungTalk 2021-09-29 阅读 67

Step1: 剔除自动配置类

package com.oldguy.example;

import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;


@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
// MybatisAutoConfiguration.class,
JpaRepositoriesAutoConfiguration.class,
HibernateJpaAutoConfiguration.class,
})
public class MultipleDatasourceDemoApplication {

public static void main(String[] args) {
SpringApplication.run(MultipleDatasourceDemoApplication.class, args);
}

}


Step2: 从SpringBoot 源码中,摘出Jpa部分配置代码,并编写成为配置类

package com.oldguy.example.modules.common.configs;

import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.Map;

/**
* @Date: 2019/1/7 0007
* @Author: ren
* @Description:
*/

public abstract class AbstractJpaConfiguration {


protected JpaVendorAdapter createJpaVendorAdapter(JpaProperties properties, DataSource dataSource) {
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setShowSql(properties.isShowSql());
adapter.setDatabase(properties.determineDatabase(dataSource));
adapter.setDatabasePlatform(properties.getDatabasePlatform());
adapter.setGenerateDdl(properties.isGenerateDdl());
return adapter;
}


protected EntityManagerFactory createEntityManagerFactory(
DataSource dataSource,
JpaProperties jpaProperties,
JpaVendorAdapter jpaVendorAdapter,
String entitiesPackage
) {

Map<String, String> map = jpaProperties.getHibernateProperties(dataSource);

LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
bean.setDataSource(dataSource);
bean.setJpaVendorAdapter(jpaVendorAdapter);
bean.setPackagesToScan(entitiesPackage);
bean.setJpaPropertyMap(map);


// 进行配置
bean.afterPropertiesSet();

return bean.getObject();
}


protected JpaTransactionManager createTransactionManager(EntityManagerFactory entityManagerFactory) {

JpaTransactionManager manager = new JpaTransactionManager();
manager.setEntityManagerFactory(entityManagerFactory);
return manager;
}
}

Step3: 编写实现类

  1. 数据源3
package com.oldguy.example.configs;

import com.alibaba.druid.pool.DruidDataSource;
import com.oldguy.example.modules.common.configs.AbstractJpaConfiguration;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
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.JpaVendorAdapter;


import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

/**
* @Date: 2019/1/7 0007
* @Author: ren
* @Description:
*/

@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "test3EntityManagerFactory",
basePackages = "com.oldguy.example.modules.test3.dao.jpas",
transactionManagerRef = "test3TransactionManager")
public class Test3DataSourceConfiguration extends AbstractJpaConfiguration {

@Value("${test3.jpa.base-package}")
private String entitiesPackage;

@Bean(name = "test3DataSource")
@ConfigurationProperties(prefix = "test3.datasource")
public DataSource test3DataSource() {
return new DruidDataSource();
}

@Bean(name = "test3JpaProperties")
@ConfigurationProperties(prefix = "test3.jpa")
public JpaProperties jpaProperties() {
return new JpaProperties();
}


@Bean(name = "test3JpaVendorAdapter")
public JpaVendorAdapter createJpaVendorAdapter(@Qualifier("test3JpaProperties") JpaProperties properties, @Qualifier("test3DataSource") DataSource dataSource) {

return super.createJpaVendorAdapter(properties, dataSource);
}


@Bean(name = "test3EntityManagerFactory")
public EntityManagerFactory LocalContainerEntityManagerFactoryBean(
@Qualifier("test3DataSource") DataSource dataSource,
@Qualifier("test3JpaProperties") JpaProperties jpaProperties,
@Qualifier("test3JpaVendorAdapter") JpaVendorAdapter jpaVendorAdapter) {


return super.createEntityManagerFactory(dataSource, jpaProperties, jpaVendorAdapter, entitiesPackage);
}


@Bean(name = "test3TransactionManager")
public JpaTransactionManager createTransactionManager(@Qualifier("test3EntityManagerFactory") EntityManagerFactory entityManagerFactory) {

return super.createTransactionManager(entityManagerFactory);
}


}

  1. 数据源4
package com.oldguy.example.configs;

import com.alibaba.druid.pool.DruidDataSource;
import com.oldguy.example.modules.common.configs.AbstractJpaConfiguration;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
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.JpaVendorAdapter;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

/**
* @Date: 2019/1/7 0007
* @Author: ren
* @Description:
*/

@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "test4EntityManagerFactory",
basePackages = "com.oldguy.example.modules.test4.dao.jpas",
transactionManagerRef = "test4TransactionManager")
public class Test4DataSourceConfiguration extends AbstractJpaConfiguration{


@Value("${test4.jpa.base-package}")
private String entitiesPackage;

@Bean(name = "test4DataSource")
@ConfigurationProperties(prefix = "test4.datasource")
public DataSource test4DataSource() {
return new DruidDataSource();
}

@Bean(name = "test4JpaProperties")
@ConfigurationProperties(prefix = "test4.jpa")
public JpaProperties jpaProperties() {
return new JpaProperties();
}


@Bean(name = "test4JpaVendorAdapter")
public JpaVendorAdapter createJpaVendorAdapter(@Qualifier("test4JpaProperties") JpaProperties properties, @Qualifier("test4DataSource") DataSource dataSource) {

return super.createJpaVendorAdapter(properties, dataSource);
}


@Bean(name = "test4EntityManagerFactory")
public EntityManagerFactory LocalContainerEntityManagerFactoryBean(
@Qualifier("test4DataSource") DataSource dataSource,
@Qualifier("test4JpaProperties") JpaProperties jpaProperties,
@Qualifier("test4JpaVendorAdapter") JpaVendorAdapter jpaVendorAdapter) {


return super.createEntityManagerFactory(dataSource, jpaProperties, jpaVendorAdapter, entitiesPackage);
}


@Bean(name = "test4TransactionManager")
public JpaTransactionManager createTransactionManager(@Qualifier("test4EntityManagerFactory") EntityManagerFactory entityManagerFactory) {

return super.createTransactionManager(entityManagerFactory);
}

}

Step4:编写配置文件


test3:
jpa:
show-sql: true
hibernate:
ddl-auto: update
base-package: com.oldguy.example.modules.test3.dao.entities
datasource:
url: jdbc:mysql://127.0.0.1:3306/multiple_datasource3?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
type: org.apache.tomcat.jdbc.pool.DataSource

test4:
jpa:
show-sql: true
hibernate:
ddl-auto: update
base-package: com.oldguy.example.modules.test4.dao.entities
datasource:
url: jdbc:mysql://127.0.0.1:3306/multiple_datasource4?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
type: org.apache.tomcat.jdbc.pool.DataSource

到此就完成了多重数据源配置。

MyBatis 测试结果:

package com.oldguy.example.modules.controllers;

import com.oldguy.example.modules.test1.dao.jpas.TestEntity1Mapper;
import com.oldguy.example.modules.test2.dao.jpas.TestEntity2Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* Created by Administrator on 2018/12/20 0020.
*/

@RestController
public class TestController {

/**
* MyBatis 数据库2
*/

@Autowired
private TestEntity2Mapper testEntity2Mapper;
/**
* MyBatis 数据库1
*/

@Autowired
private TestEntity1Mapper testEntity1Mapper;

@GetMapping("test1")
public Object test1(){
return testEntity1Mapper.findAllByStatus(null);
}

@GetMapping("test2")
public Object test2(){
return testEntity2Mapper.findAllByStatus(null);
}
}

图片结果:


Jpa 测试结果:

  1. 数据源3
package com.oldguy.example.modules.test3.controllers;

import com.oldguy.example.modules.test3.dao.jpas.TestUserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* @Date: 2019/1/7 0007
* @Author: ren
* @Description:
*/

@RestController
@RequestMapping("TestUser")
public class TestUserController {

@Autowired
private TestUserRepository testUserRepository;


@GetMapping("list")
public Object getList(){
return testUserRepository.findAll();
}
}

  1. 数据源4
package com.oldguy.example.modules.test4.controllers;

import com.oldguy.example.modules.test4.dao.jpas.RemarkRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* @Date: 2019/1/7 0007
* @Author: ren
* @Description:
*/

@RestController
@RequestMapping("Test4")
public class Test4Controller {


@Autowired
private RemarkRepository remarkRepository;

@GetMapping("message")
public Object getMessage(String message){
return remarkRepository.findByMessage(message);
}

@GetMapping("list")
public Object getList(){
return remarkRepository.findAll();
}
}

图片结果:


以上就完成了SpringBoot 同时使用MyBatis 和 Jpa 配置双方多重数据源。
代码可以参考 GitHub https://github.com/oldguys/MultipleDataSourceDemo

举报

相关推荐

0 条评论