Spring Jpa多數(shù)據(jù)源工程配置過(guò)程解析
工程創(chuàng)建
首先是創(chuàng)建一個(gè)Spring Boot工程,創(chuàng)建時(shí)添加基本的Web、Jpa以及MySQL依賴,如下:

創(chuàng)建完成后,添加Druid依賴,這里和前文的要求一樣,要使用專為Spring Boot打造的Druid,大伙可能發(fā)現(xiàn)了,如果整合多數(shù)據(jù)源一定要使用這個(gè)依賴,因?yàn)檫@個(gè)依賴中才有DruidDataSourceBuilder,最后還要記得鎖定數(shù)據(jù)庫(kù)依賴的版本,因?yàn)榭赡艽蟛糠秩擞玫倪€是5.x的MySQL而不是8.x。完整依賴如下:
<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)建成功了。
基本配置
在基本配置中,我們首先來(lái)配置多數(shù)據(jù)源基本信息以及DataSource,首先在application.properties中添加如下配置信息:
# 數(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ù)源的配置和前文一致,然后接下來(lái)配置兩個(gè)DataSource,如下:
@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ù)源配置基本一致,但是注意多了一個(gè)在Spring中使用較少的注解@Primary,這個(gè)注解一定不能少,否則在項(xiàng)目啟動(dòng)時(shí)會(huì)出錯(cuò),@Primary表示當(dāng)某一個(gè)類存在多個(gè)實(shí)例時(shí),優(yōu)先使用哪個(gè)實(shí)例。
好了,這樣,DataSource就有了。
多數(shù)據(jù)源配置
接下來(lái)配置Jpa的基本信息,這里兩個(gè)數(shù)據(jù)源,我分別在兩個(gè)類中來(lái)配置,先來(lái)看第一個(gè)配置:
@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)提供的一個(gè)實(shí)例,里邊的數(shù)據(jù)就是我們?cè)赼pplication.properties中配置的jpa相關(guān)的配置。然后我們提供兩個(gè)Bean,分別是LocalContainerEntityManagerFactoryBean和PlatformTransactionManager事務(wù)管理器,不同于MyBatis和JdbcTemplate,在Jpa中,事務(wù)一定要配置。在提供LocalContainerEntityManagerFactoryBean的時(shí)候,需要指定packages,這里的packages指定的包就是這個(gè)數(shù)據(jù)源對(duì)應(yīng)的實(shí)體類所在的位置,另外在這里配置類上通過(guò)@EnableJpaRepositories注解指定dao所在的位置,以及LocalContainerEntityManagerFactoryBean和PlatformTransactionManager分別對(duì)應(yīng)的引用的名字。
好了,這樣第一個(gè)就配置好了,第二個(gè)基本和這個(gè)類似,主要有幾個(gè)不同點(diǎn):
- dao的位置不同
- persistenceUnit不同
- 相關(guān)bean的名稱不同
注意實(shí)體類可以共用。
代碼如下:
@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());
}
}
接下來(lái),在對(duì)應(yīng)位置分別提供相關(guān)的實(shí)體類和dao即可,數(shù)據(jù)源一的dao如下:
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如下:
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í)體類如下:
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
}
到此,所有的配置就算完成了,接下來(lái)就可以在Service中注入不同的UserDao,不同的UserDao操作不同的數(shù)據(jù)源。
其實(shí)整合Jpa多數(shù)據(jù)源也不算難,就是有幾個(gè)細(xì)節(jié)問(wèn)題,這些細(xì)節(jié)問(wèn)題解決,其實(shí)前面介紹的其他多數(shù)據(jù)源整個(gè)都差不多。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)統(tǒng)計(jì)文件夾下所有文件的字?jǐn)?shù)
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)統(tǒng)計(jì)文件夾下所有文件的字?jǐn)?shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
Java連接 JDBC基礎(chǔ)知識(shí)(操作數(shù)據(jù)庫(kù):增刪改查)
這篇文章主要介紹了Java連接 JDBC基礎(chǔ)知識(shí),包括操作數(shù)據(jù)庫(kù)之增刪改查操作,需要的朋友可以參考下2021-04-04
多線程下嵌套異步任務(wù)導(dǎo)致程序假死問(wèn)題
這篇文章主要介紹了多線程下嵌套異步任務(wù)導(dǎo)致程序假死問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Java實(shí)現(xiàn)單例模式的五種方式總結(jié)
這篇文章主要介紹了如何實(shí)現(xiàn)一個(gè)單例模式,包括構(gòu)造器私有化、提供靜態(tài)私有變量和公共獲取實(shí)例接口,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
java中的session對(duì)象及其常用方法小結(jié)
這篇文章主要介紹了java中的session對(duì)象及其常用方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

