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

由于現(xiàn)在很多系統(tǒng)都不在使用單一數(shù)據(jù)庫,所以想試下springboot jpa多數(shù)據(jù)源配置纸巷,網(wǎng)上也有很多這方便的文章,可能是版本不一致眶痰,存在這各種問題瘤旨,始終無法成功運(yùn)行,后經(jīng)過反復(fù)嘗試竖伯,最后終于成功運(yùn)行存哲,這里做下記錄:
springboot 版本:2.2.2.RELEASE
數(shù)據(jù)庫:mysql 5.7
開發(fā)工具:idea 2019.2
1、首先要有多個(gè)數(shù)據(jù)庫七婴,我這里創(chuàng)建了2個(gè)數(shù)據(jù)庫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

配置說明:
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ù)饲化,在此就不多做說明,不清楚的可以網(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ù)庫
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

通過navicat工具查看:


image.png

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

image.png

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市减拭,隨后出現(xiàn)的幾起案子蔽豺,更是在濱河造成了極大的恐慌,老刑警劉巖拧粪,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件修陡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡既们,警方通過查閱死者的電腦和手機(jī)濒析,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門正什,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啥纸,“玉大人,你說我怎么就攤上這事婴氮∷拱簦” “怎么了盾致?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)荣暮。 經(jīng)常有香客問我庭惜,道長(zhǎng),這世上最難降的妖魔是什么穗酥? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任护赊,我火速辦了婚禮,結(jié)果婚禮上砾跃,老公的妹妹穿的比我還像新娘骏啰。我一直安慰自己,他們只是感情好抽高,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布判耕。 她就那樣靜靜地躺著,像睡著了一般翘骂。 火紅的嫁衣襯著肌膚如雪壁熄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天碳竟,我揣著相機(jī)與錄音草丧,去河邊找鬼。 笑死瞭亮,一個(gè)胖子當(dāng)著我的面吹牛方仿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播统翩,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼仙蚜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了厂汗?” 一聲冷哼從身側(cè)響起委粉,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娶桦,沒想到半個(gè)月后贾节,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衷畦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年栗涂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祈争。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斤程,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菩混,到底是詐尸還是另有隱情忿墅,我是刑警寧澤扁藕,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站疚脐,受9級(jí)特大地震影響亿柑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棍弄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一望薄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呼畸,春花似錦式矫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瞬痘,卻和暖如春故慈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背框全。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工察绷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人津辩。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓拆撼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親喘沿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闸度,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355