一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Spring Jpa多數(shù)據(jù)源工程配置過程解析

Spring Jpa多數(shù)據(jù)源工程配置過程解析

2020-08-17 12:27柒丶月 Java教程

這篇文章主要介紹了Spring Jpa多數(shù)據(jù)源工程配置過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

工程創(chuàng)建

首先是創(chuàng)建一個Spring Boot工程,創(chuàng)建時(shí)添加基本的Web、Jpa以及MySQL依賴,如下:

Spring Jpa多數(shù)據(jù)源工程配置過程解析

創(chuàng)建完成后,添加Druid依賴,這里和前文的要求一樣,要使用專為Spring Boot打造的Druid,大伙可能發(fā)現(xiàn)了,如果整合多數(shù)據(jù)源一定要使用這個依賴,因?yàn)檫@個依賴中才有DruidDataSourceBuilder,最后還要記得鎖定數(shù)據(jù)庫依賴的版本,因?yàn)榭赡艽蟛糠秩擞玫倪€是5.x的MySQL而不是8.x。完整依賴如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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>com.alibaba</groupId>
  <artifactId>druid-spring-boot-starter</artifactId>
  <version>1.1.10</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.28</version>
  <scope>runtime</scope>
</dependency>

如此之后,工程就創(chuàng)建成功了。

基本配置

在基本配置中,我們首先來配置多數(shù)據(jù)源基本信息以及DataSource,首先在application.properties中添加如下配置信息:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 數(shù)據(jù)源一
spring.datasource.one.username=root
spring.datasource.one.password=root
spring.datasource.one.url=jdbc:mysql:///test01?useUnicode=true&characterEncoding=UTF-8
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
 
# 數(shù)據(jù)源二
spring.datasource.two.username=root
spring.datasource.two.password=root
spring.datasource.two.url=jdbc:mysql:///test02?useUnicode=true&characterEncoding=UTF-8
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
 
# Jpa配置
spring.jpa.properties.database=mysql
spring.jpa.properties.show-sql=true
spring.jpa.properties.database-platform=mysql
spring.jpa.properties.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

這里Jpa的配置和上文相比key中多了properties,多數(shù)據(jù)源的配置和前文一致,然后接下來配置兩個DataSource,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
public class DataSourceConfig {
  @Bean
  @ConfigurationProperties(prefix = "spring.datasource.one")
  @Primary
  DataSource dsOne() {
    return DruidDataSourceBuilder.create().build();
  }
  @Bean
  @ConfigurationProperties(prefix = "spring.datasource.two")
  DataSource dsTwo() {
    return DruidDataSourceBuilder.create().build();
  }
}

這里的配置和前文的多數(shù)據(jù)源配置基本一致,但是注意多了一個在Spring中使用較少的注解@Primary,這個注解一定不能少,否則在項(xiàng)目啟動時(shí)會出錯,@Primary表示當(dāng)某一個類存在多個實(shí)例時(shí),優(yōu)先使用哪個實(shí)例。

好了,這樣,DataSource就有了。

多數(shù)據(jù)源配置

接下來配置Jpa的基本信息,這里兩個數(shù)據(jù)源,我分別在兩個類中來配置,先來看第一個配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Configuration
@EnableJpaRepositories(basePackages = "org.sang.jpa.dao",entityManagerFactoryRef = "localContainerEntityManagerFactoryBeanOne",transactionManagerRef = "platformTransactionManagerOne")
public class JpaConfigOne {
  @Autowired
  @Qualifier(value = "dsOne")
  DataSource dsOne;
 
  @Autowired
  JpaProperties jpaProperties;
 
  @Bean
  @Primary
  LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBeanOne(EntityManagerFactoryBuilder builder) {
    return builder.dataSource(dsOne)
        .packages("org.sang.jpa.model")
        .properties(jpaProperties.getProperties())
        .persistenceUnit("pu1")
        .build();
  }
 
  @Bean
  PlatformTransactionManager platformTransactionManagerOne(EntityManagerFactoryBuilder builder) {
    LocalContainerEntityManagerFactoryBean factoryBeanOne = localContainerEntityManagerFactoryBeanOne(builder);
    return new JpaTransactionManager(factoryBeanOne.getObject());
  }
}

首先這里注入dsOne,再注入JpaProperties,JpaProperties是系統(tǒng)提供的一個實(shí)例,里邊的數(shù)據(jù)就是我們在application.properties中配置的jpa相關(guān)的配置。然后我們提供兩個Bean,分別是LocalContainerEntityManagerFactoryBean和PlatformTransactionManager事務(wù)管理器,不同于MyBatis和JdbcTemplate,在Jpa中,事務(wù)一定要配置。在提供LocalContainerEntityManagerFactoryBean的時(shí)候,需要指定packages,這里的packages指定的包就是這個數(shù)據(jù)源對應(yīng)的實(shí)體類所在的位置,另外在這里配置類上通過@EnableJpaRepositories注解指定dao所在的位置,以及LocalContainerEntityManagerFactoryBean和PlatformTransactionManager分別對應(yīng)的引用的名字。

好了,這樣第一個就配置好了,第二個基本和這個類似,主要有幾個不同點(diǎn):

  • dao的位置不同
  • persistenceUnit不同
  • 相關(guān)bean的名稱不同

注意實(shí)體類可以共用。

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Configuration
@EnableJpaRepositories(basePackages = "org.sang.jpa.dao2",entityManagerFactoryRef = "localContainerEntityManagerFactoryBeanTwo",transactionManagerRef = "platformTransactionManagerTwo")
public class JpaConfigTwo {
  @Autowired
  @Qualifier(value = "dsTwo")
  DataSource dsTwo;
 
  @Autowired
  JpaProperties jpaProperties;
 
  @Bean
  LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBeanTwo(EntityManagerFactoryBuilder builder) {
    return builder.dataSource(dsTwo)
        .packages("org.sang.jpa.model")
        .properties(jpaProperties.getProperties())
        .persistenceUnit("pu2")
        .build();
  }
 
  @Bean
  PlatformTransactionManager platformTransactionManagerTwo(EntityManagerFactoryBuilder builder) {
    LocalContainerEntityManagerFactoryBean factoryBeanTwo = localContainerEntityManagerFactoryBeanTwo(builder);
    return new JpaTransactionManager(factoryBeanTwo.getObject());
  }
}

接下來,在對應(yīng)位置分別提供相關(guān)的實(shí)體類和dao即可,數(shù)據(jù)源一的dao如下:

?
1
2
3
4
5
6
7
package org.sang.jpa.dao;
public interface UserDao extends JpaRepository<User,Integer> {
  List<User> getUserByAddressEqualsAndIdLessThanEqual(String address, Integer id);
 
  @Query(value = "select * from t_user where id=(select max(id) from t_user)",nativeQuery = true)
  User maxIdUser();
}

數(shù)據(jù)源二的dao如下:

?
1
2
3
4
5
6
7
8
package org.sang.jpa.dao2;
 
public interface UserDao2 extends JpaRepository<User,Integer> {
  List<User> getUserByAddressEqualsAndIdLessThanEqual(String address, Integer id);
 
  @Query(value = "select * from t_user where id=(select max(id) from t_user)",nativeQuery = true)
  User maxIdUser();
}

共同的實(shí)體類如下:

?
1
2
3
4
5
6
7
8
9
10
11
package org.sang.jpa.model;
 
@Entity(name = "t_user")
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id;
  private String username;
  private String address;
  //省略getter/setter
}

到此,所有的配置就算完成了,接下來就可以在Service中注入不同的UserDao,不同的UserDao操作不同的數(shù)據(jù)源。

其實(shí)整合Jpa多數(shù)據(jù)源也不算難,就是有幾個細(xì)節(jié)問題,這些細(xì)節(jié)問題解決,其實(shí)前面介紹的其他多數(shù)據(jù)源整個都差不多。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://www.cnblogs.com/qiuwenli/p/13442839.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女和男人免费网站视频 | 欧美午夜网站 | 亚洲免费视频在线观看 | 日韩欧美亚洲一区精选 | 免费福利资源站在线视频 | 麻豆小视频在线观看 | 天天操天天射天天色 | 成人免费体验区福利云点播 | 天天做天天爽天天谢 | 国产在线精品一区二区高清不卡 | 欧美破处摘花 | 天天干天天色综合 | 亚欧有色在线观看免费版高清 | 天天狠天天天天透在线 | 国产一区日韩二区欧美三 | 无码乱人伦一区二区亚洲 | 亚洲v成人天堂影视 | wc凹凸撒尿间谍女厕hd | 香蕉久草 | 亚洲第一国产 | 古代翁熄系小说辣文 | 99热在线观看免费 | 精品丰满人妻无套内射 | 肥奶丰熟肥妇 | poronovideos极度变态 | juy_661佐佐木明希在线播放 | 亚洲精品一区二区久久久久 | 久久中文字幕无线观看 | 亚洲欧美日韩中文字幕久久 | 国产亚洲玖玖玖在线观看 | 九九365资源稳定资源站 | 含羞草国产亚洲精品岁国产精品 | 国产精品午夜国产小视频 | 91禁漫| 欧美一区精品二区三区 | a毛片免费观看完整 | 久久精品视频uu | 日韩一级精品视频在线观看 | 午夜理伦片免费 | 亚洲精品国产一区二区在线 | 国产视频一区二区 |