Spring Jpa多數(shù)據(jù)源工程配置過程解析
工程創(chuàng)建
首先是創(chuàng)建一個Spring Boot工程,創(chuàng)建時添加基本的Web、Jpa以及MySQL依賴,如下:
創(chuàng)建完成后,添加Druid依賴,這里和前文的要求一樣,要使用專為Spring Boot打造的Druid,大伙可能發(fā)現(xiàn)了,如果整合多數(shù)據(jù)源一定要使用這個依賴,因為這個依賴中才有DruidDataSourceBuilder,最后還要記得鎖定數(shù)據(jù)庫依賴的版本,因為可能大部分人用的還是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)建成功了。
基本配置
在基本配置中,我們首先來配置多數(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ù)源的配置和前文一致,然后接下來配置兩個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ù)源配置基本一致,但是注意多了一個在Spring中使用較少的注解@Primary,這個注解一定不能少,否則在項目啟動時會出錯,@Primary表示當某一個類存在多個實例時,優(yōu)先使用哪個實例。
好了,這樣,DataSource就有了。
多數(shù)據(jù)源配置
接下來配置Jpa的基本信息,這里兩個數(shù)據(jù)源,我分別在兩個類中來配置,先來看第一個配置:
@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ù)據(jù)就是我們在application.properties中配置的jpa相關的配置。然后我們提供兩個Bean,分別是LocalContainerEntityManagerFactoryBean和PlatformTransactionManager事務管理器,不同于MyBatis和JdbcTemplate,在Jpa中,事務一定要配置。在提供LocalContainerEntityManagerFactoryBean的時候,需要指定packages,這里的packages指定的包就是這個數(shù)據(jù)源對應的實體類所在的位置,另外在這里配置類上通過@EnableJpaRepositories注解指定dao所在的位置,以及LocalContainerEntityManagerFactoryBean和PlatformTransactionManager分別對應的引用的名字。
好了,這樣第一個就配置好了,第二個基本和這個類似,主要有幾個不同點:
- dao的位置不同
- persistenceUnit不同
- 相關bean的名稱不同
注意實體類可以共用。
代碼如下:
@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()); } }
接下來,在對應位置分別提供相關的實體類和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(); }
共同的實體類如下:
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ù)源。
其實整合Jpa多數(shù)據(jù)源也不算難,就是有幾個細節(jié)問題,這些細節(jié)問題解決,其實前面介紹的其他多數(shù)據(jù)源整個都差不多。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Java使用Thread創(chuàng)建多線程并啟動操作示例
這篇文章主要介紹了Java使用Thread創(chuàng)建多線程并啟動操作,結(jié)合實例形式分析了Java基于Thread類的多線程定義與啟動簡單操作技巧,需要的朋友可以參考下2018-06-06Maven中錯誤使用parent.relativePath導致構(gòu)建失敗問題
這篇文章主要介紹了Maven中錯誤使用parent.relativePath導致構(gòu)建失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08SpringBoot+MyBatis-Plus實現(xiàn)分頁功能
在SpringBoot項目中,結(jié)合MyBatis-Plus(簡稱MP)可以非常方便地實現(xiàn)分頁功能,MP為開發(fā)者提供了分頁插件PaginationInterceptor,只需簡單配置即可使用,本文給大家介紹了SpringBoot+MyBatis-Plus實現(xiàn)分頁功能,文中通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下2024-01-01java實現(xiàn)數(shù)字轉(zhuǎn)換人民幣中文大寫工具
這篇文章主要為大家詳細介紹了java實現(xiàn)數(shù)字轉(zhuǎn)換人民幣中文大寫工具,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04Java讀取txt文件中的數(shù)據(jù)賦給String變量方法
今天小編就為大家分享一篇Java讀取txt文件中的數(shù)據(jù)賦給String變量方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07java常用工具類之數(shù)據(jù)庫連接類(可以連接多種數(shù)據(jù)庫)
這篇文章主要介紹了java常用工具類之數(shù)據(jù)庫連接類,可以連接多種數(shù)據(jù)庫,代碼中包含詳細注釋,需要的朋友可以參考下2014-07-07