springboot jpa多數(shù)據(jù)源

由于現(xiàn)在很多系統(tǒng)都不在使用單一數(shù)據(jù)庫(kù),所以想試下springboot jpa多數(shù)據(jù)源配置,網(wǎng)上也有很多這方便的文章,可能是版本不一致,存在這各種問(wèn)題,始終無(wú)法成功運(yùn)行,后經(jīng)過(guò)反復(fù)嘗試,最后終于成功運(yùn)行,這里做下記錄:
springboot 版本:2.2.2.RELEASE
數(shù)據(jù)庫(kù):mysql 5.7
開(kāi)發(fā)工具:idea 2019.2
1、首先要有多個(gè)數(shù)據(jù)庫(kù),我這里創(chuàng)建了2個(gè)數(shù)據(jù)庫(kù)demo、demo2
2、創(chuàng)建項(xiàng)目
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo1</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2、application.yml

spring:
  datasource:
    ds1:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
      username: root
      password: 1234
    ds2:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/demo2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
      username: root
      password: 1234
  jpa:
    hibernate:
      ddl-auto: update
    open-in-view: true
    properties:
      hibernate:
        physical_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
        implicit_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
        dialect:  org.hibernate.dialect.MySQL57Dialect
        format_sql: true
        hbm2ddl:
          auto: update
    show-sql: true
    database: mysql

配置說(shuō)明:
springboot默認(rèn)使用的HikariPool數(shù)據(jù)源,數(shù)據(jù)源配置應(yīng)使用jdbc-url,而不是常用的url。單個(gè)數(shù)據(jù)源時(shí)使用的spring.jpa.hibernate下的配置,而使用多數(shù)據(jù)源時(shí)則使用的是spring.jpa.hibernate.properties下的配置,具體配置網(wǎng)上有很多數(shù)據(jù),在此就不多做說(shuō)明,不清楚的可以網(wǎng)上查一下。這里就提一下physical_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
implicit_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
這兩個(gè)配置是創(chuàng)建表時(shí)表字段使用下劃線形式,而不是駝峰形式,若不配置,表字段和實(shí)體屬性一致。
3、實(shí)體類,此處創(chuàng)建兩個(gè)實(shí)體類,分別對(duì)應(yīng)demo、demo2兩個(gè)數(shù)據(jù)庫(kù)
Person類

@Entity
@Table(name = "d_person")
public class Person implements Serializable {

    private static final long serialVersionUID = 580119470723651341L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String personNo;

    private String name;

    private Integer age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getPersonNo() {
        return personNo;
    }

    public void setPersonNo(String personNo) {
        this.personNo = personNo;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

Student類

@Entity
@Table(name = "d_student")
public class Student implements Serializable {

    private static final long serialVersionUID = 7993941906610435818L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String studentNo;

    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getStudentNo() {
        return studentNo;
    }

    public void setStudentNo(String studentNo) {
        this.studentNo = studentNo;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

4、Repository類

@Repository
public interface PersonRepository extends BaseRepository<Person,Long> {

}
@Repository
public interface StudentRepository extends BaseRepository<Student,Long> {
}

這里的BaseRepository是我自己定義的接口,主要繼承了Repository接口
5、配置類
DataSourceConfigDs1和DataSourceConfigDs2分別對(duì)應(yīng)demo、demo2

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactoryDs1",//配置連接工廠 entityManagerFactory
        transactionManagerRef = "transactionManagerDs1", //配置 事物管理器  transactionManager
        basePackages = {"com.example.demo1.repository.ds1"}
)
public class DataSourceConfigDs1 {

    @Bean(name = "ds1")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.ds1")
    public DataSource dataSourceDs1(){
        return DataSourceBuilder.create().build();
    }

    @Autowired
    private JpaProperties jpaProperties;

    @Bean("entityManagerDs1")
    @Primary
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactoryBean(builder).getObject().createEntityManager();
    }
    @Bean("entityManagerFactoryDs1")
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(dataSourceDs1())
                .properties(jpaProperties.getProperties())
                .packages("com.example.demo1.repository.ds1")
                //持久化單元名稱,當(dāng)存在多個(gè)EntityManagerFactory時(shí),需要制定此名稱
                .persistenceUnit("persistenceUnitDs1")
                .build();

    }

    @Bean("transactionManagerDs1")
    @Primary
    public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryBean(builder).getObject());
    }
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactoryDs2",//配置連接工廠 entityManagerFactory
        transactionManagerRef = "transactionManagerDs2", //配置 事物管理器  transactionManager
        basePackages = {"com.example.demo1.repository.ds2"}
)
public class DataSourceConfigDs2 {

    @Bean(name = "ds2")
    @ConfigurationProperties(prefix = "spring.datasource.ds2")
    public DataSource dataSourceDs2(){
        return DataSourceBuilder.create().build();
    }

    @Autowired
    private JpaProperties jpaProperties;

    @Bean("entityManagerDs2")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactoryBean(builder).getObject().createEntityManager();
    }
    @Bean(value = "entityManagerFactoryDs2")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(dataSourceDs2())
                .properties(jpaProperties.getProperties())
                .packages("com.example.demo1.repository.ds2")
                //持久化單元名稱,當(dāng)存在多個(gè)EntityManagerFactory時(shí),需要制定此名稱
                .persistenceUnit("persistenceUnitDs2")
                .build();

    }

    @Bean("transactionManagerDs2")
    public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryBean(builder).getObject());
    }
}

配置多數(shù)據(jù)源時(shí)需要指定主數(shù)據(jù)源,使用@Primary即可。basePackages 為Reporitory類路徑,對(duì)應(yīng)的實(shí)體類應(yīng)該在Repository類路徑下。
項(xiàng)目啟動(dòng)后可以看到控制臺(tái)有sql打印:


image.png

image.png

通過(guò)navicat工具查看:


image.png

表結(jié)構(gòu):
image.png

image.png

由上圖可以看出字段為下劃線格式

到此整個(gè)springboot jpa多數(shù)源的配置過(guò)程就完成了。
代碼github:https://github.com/panli1988/demo1/tree/master/src/main/java/com/example/demo1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容