深入了解Springboot核心知識點之?dāng)?shù)據(jù)訪問配置
環(huán)境:Springboot2.4.13
自定義數(shù)據(jù)源配置
@Bean
@ConfigurationProperties(prefix="app.datasource")
public DataSource dataSource() {
return new FancyDataSource();
}
配置文件
app:
datasource:
url: "jdbc:h2:mem:mydb"
username: "sa"
password: "123123"
pool-size: 30
FancyDataSource類具有相應(yīng)的url,username,pool-size屬性。
Spring Boot還提供了一個名為DataSourceBuilder的實用工具生成器類,可用于創(chuàng)建一個標(biāo)準(zhǔn)數(shù)據(jù)源(如果它位于類路徑上)。構(gòu)建器可以根據(jù)類路徑上的可用內(nèi)容檢測要使用的類。它還根據(jù)JDBCURL自動檢測驅(qū)動程序。
@Bean
@ConfigurationProperties("app.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
然而,有一個陷阱。因為連接池的實際類型沒有提供,所以在自定義數(shù)據(jù)源的元數(shù)據(jù)中沒有生成任何鍵,并且IDE中沒有可用的完成(因為數(shù)據(jù)源接口不公開任何屬性)。此外,如果類路徑上碰巧有Hikari,則此基本設(shè)置不起作用,因為Hikari沒有url屬性(但有jdbcUrl屬性)。在這種情況下,你必須按如下方式重寫配置:
app:
datasource:
jdbc-url: "jdbc:mysql://localhost/test"
username: "dbuser"
password: "dbpass"
pool-size: 30
可以強制指定數(shù)據(jù)源類型
@Bean
@ConfigurationProperties("app.datasource")
public HikariDataSource dataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
多數(shù)據(jù)源配置
如果需要配置多個數(shù)據(jù)源,可以應(yīng)用上一節(jié)中描述的相同技巧。但是,你必須將其中一個數(shù)據(jù)源實例標(biāo)記為@Primary,因為將來的各種自動配置都希望能夠按類型獲得一個。
如果您創(chuàng)建自己的數(shù)據(jù)源,自動配置將退出。在以下示例中,我們提供了與主數(shù)據(jù)源上的自動配置完全相同的功能集:
@Bean
@Primary
@ConfigurationProperties("app.datasource.first")
public DataSourceProperties firstDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("app.datasource.first.configuration")
public HikariDataSource firstDataSource() {
return firstDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
}
@Bean
@ConfigurationProperties("app.datasource.second")
public BasicDataSource secondDataSource() {
return DataSourceBuilder.create().type(BasicDataSource.class).build();
}
這兩個數(shù)據(jù)源還綁定了高級定制。例如,您可以按如下方式配置它們:
app:
datasource:
first:
url: "jdbc:mysql://localhost/first"
username: "dbuser"
password: "dbpass"
configuration:
maximum-pool-size: 30
second:
url: "jdbc:mysql://localhost/second"
username: "dbuser"
password: "dbpass"
max-total: 30
你也可以將相同的概念應(yīng)用于輔助數(shù)據(jù)源,如以下示例所示:
@Bean
@Primary
@ConfigurationProperties("app.datasource.first")
public DataSourceProperties firstDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("app.datasource.first.configuration")
public HikariDataSource firstDataSource() {
return firstDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
}
@Bean
@ConfigurationProperties("app.datasource.second")
public DataSourceProperties secondDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("app.datasource.second.configuration")
public BasicDataSource secondDataSource() {
return secondDataSourceProperties().initializeDataSourceBuilder().type(BasicDataSource.class).build();
}
使用Spring Data Repositories
Spring data 可以創(chuàng)建各種風(fēng)格的@Repository接口的實現(xiàn)。只要這些@Repositories包含在@EnableAutoConfiguration類的同一個包(或子包)中,Spring Boot就可以為您處理所有這些。
對于許多應(yīng)用程序,只需將正確的Spring Data依賴項放在類路徑上。
spring-boot-starter-data-jpa for JPA, spring-boot-starter-data-mongodb for Mongodb,等等。要開始,請創(chuàng)建一些存儲庫接口來處理@Entity對象。
Spring Boot根據(jù)找到的@EnableAutoConfiguration,嘗試猜測@Repository定義的位置。要獲得更多控制,請使用@EnableJpaRepositories注釋。
將@Entity定義與Spring配置分開
Spring Boot試圖根據(jù)它找到的@EnableAutoConfiguration猜測@Entity定義的位置。要獲得更多控制,可以使用@EntityScan注釋,如下例所示:
@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration
@EntityScan(basePackageClasses=City.class)
public class Application {
//...
}
配置JPA屬性
Spring Data JPA已經(jīng)提供了一些獨立于供應(yīng)商的配置選項(如SQL日志記錄選項),SpringBoot將這些選項和Hibernate的一些選項公開為外部配置屬性。其中一些是根據(jù)上下文自動檢測的,因此您不必設(shè)置它們。
spring.jpa.hibernate.ddl-auto是一種特殊情況,因為根據(jù)運行時條件,它有不同的默認值。如果使用嵌入式數(shù)據(jù)庫,并且沒有模式管理器(如Liquibase或Flyway)處理數(shù)據(jù)源,則默認情況下為create-drop。在所有其他情況下,它默認為none。
要使用的方言由JPA提供程序檢測。如果您喜歡自己設(shè)置方言,請設(shè)置
spring.jpa.database-platform屬性。
spring:
jpa:
hibernate:
naming:
physical-strategy: "com.example.MyPhysicalNamingStrategy"
show-sql: true
配置Hibernate命名策略
Hibernate使用兩種不同的命名策略將名稱從對象模型映射到相應(yīng)的數(shù)據(jù)庫名稱。可以通過設(shè)置
spring.jpa.hibernate.naming.physical-strategy屬性,屬性值為類的全限定名,package + clalss。
默認情況下,Spring Boot使用
SpringPhysicalNamingStrategy配置物理命名策略。此實現(xiàn)提供了與Hibernate4相同的表結(jié)構(gòu):所有點都替換為下劃線,駝峰大小寫也替換為下劃線。此外,默認情況下,所有表名都以小寫形式生成。例如,電話號碼實體映射到電話號碼表。如果您的模式需要混合大小寫標(biāo)識符,請定義自定義SpringPhysicalNamingStrategybean,如以下示例所示:
@Bean
SpringPhysicalNamingStrategy caseSensitivePhysicalNamingStrategy() {
return new SpringPhysicalNamingStrategy() {
@Override
protected boolean isCaseInsensitive(JdbcEnvironment jdbcEnvironment) {
return false;
}
};
}
如果您更喜歡使用Hibernate 5的默認設(shè)置,請設(shè)置以下屬性:
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
或者,您可以配置以下bean
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
配置Hibernat二級緩存
Hibernate二級緩存可以為一系列緩存提供程序進行配置。與其將Hibernate配置為再次查找緩存提供程序,不如盡可能提供上下文中可用的緩存提供程序。
要使用JCache實現(xiàn)這一點,首先要確保
org.hibernate.HibernateJCache在類路徑上可用。然后,添加HibernatePropertiesCustomizer bean,如以下示例所示:
@Configuration(proxyBeanMethods = false)
public class HibernateSecondLevelCacheExample {
@Bean
public HibernatePropertiesCustomizer hibernateSecondLevelCacheCustomizer(JCacheCacheManager cacheManager) {
return (properties) -> properties.put(ConfigSettings.CACHE_MANAGER, cacheManager.getCacheManager());
}
}
使用多個EntityManagerFactories
如果需要對多個數(shù)據(jù)源使用JPA,那么每個數(shù)據(jù)源可能需要一個EntityManagerFactory。Spring ORM中的
LocalContainerEntityManagerFactoryBean允許您根據(jù)需要配置EntityManagerFactory。您還可以重用JPA屬性來綁定每個EntityManagerFactory的設(shè)置,如以下示例所示:
@Bean
@ConfigurationProperties("app.jpa.first")
public JpaProperties firstJpaProperties() {
return new JpaProperties();
}
@Bean
public LocalContainerEntityManagerFactoryBean firstEntityManagerFactory(DataSource firstDataSource, JpaProperties firstJpaProperties) {
EntityManagerFactoryBuilder builder = createEntityManagerFactoryBuilder(firstJpaProperties);
return builder.dataSource(firstDataSource).packages(Order.class).persistenceUnit("firstDs").build();
}
private EntityManagerFactoryBuilder createEntityManagerFactoryBuilder(JpaProperties jpaProperties) {
JpaVendorAdapter jpaVendorAdapter = createJpaVendorAdapter(jpaProperties);
return new EntityManagerFactoryBuilder(jpaVendorAdapter, jpaProperties.getProperties(), null);
}
private JpaVendorAdapter createJpaVendorAdapter(JpaProperties jpaProperties) {
// Map JPA properties as needed
return new HibernateJpaVendorAdapter();
}
上面的示例使用名為firstDataSource的數(shù)據(jù)源bean創(chuàng)建EntityManagerFactory。它掃描與訂單位于同一包中的實體??梢允褂迷搼?yīng)用程序映射其他JPA屬性。
將Spring數(shù)據(jù)存儲庫公開為REST端點
Spring Data Rest可以將 Repository 實現(xiàn)公開為REST端點,前提是已經(jīng)為應(yīng)用程序啟用了 SpringMVC。
Spring Boot暴露了一組有用的屬性(來自Spring.data.rest命名空間),用于自定義
RepositoryRestConfiguration。如果需要提供額外的定制,那么應(yīng)該使用RepositoryRestConfiguration。
使用
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-rest-webmvc</artifactId> </dependency>
以上就是深入了解Springboot核心知識點之?dāng)?shù)據(jù)訪問配置的詳細內(nèi)容,更多關(guān)于Springboot數(shù)據(jù)訪問配置的資料請關(guān)注腳本之家其它相關(guān)文章!
- SpringBoot對數(shù)據(jù)訪問層進行單元測試的方法詳解
- 基于Springboot+Mybatis對數(shù)據(jù)訪問層進行單元測試的方式分享
- springboot數(shù)據(jù)訪問和數(shù)據(jù)視圖的使用方式詳解
- SpringBoot實戰(zhàn)記錄之?dāng)?shù)據(jù)訪問
- SpringBoot中Mybatis + Druid 數(shù)據(jù)訪問的詳細過程
- SpringBoot數(shù)據(jù)訪問自定義使用Druid數(shù)據(jù)源的方法
- SpringBoot+MyBatis簡單數(shù)據(jù)訪問應(yīng)用的實例代碼
- SpringBoot數(shù)據(jù)訪問的實現(xiàn)
相關(guān)文章
Spring?Boot?MQTT?Too?many?publishes?in?progress錯誤的解決方
本文介紹Spring?Boot?MQTT?Too?many?publishes?in?progress錯誤的解決方案,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-07-07
利用反射實現(xiàn)Excel和CSV 轉(zhuǎn)換為Java對象功能
將Excel或CSV文件轉(zhuǎn)換為Java對象(POJO)以及將Java對象轉(zhuǎn)換為Excel或CSV文件可能是一個復(fù)雜的過程,但如果使用正確的工具和技術(shù),這個過程就會變得十分簡單,在本文中,我們將了解如何利用一個Java反射的庫來實現(xiàn)這個功能,需要的朋友可以參考下2023-11-11
Java遠程調(diào)用組件Feign技術(shù)使用詳解
Feign是Netflix公司開發(fā)的一個聲明式的REST調(diào)用客戶端; Ribbon負載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進行微服務(wù)開發(fā)非?;A(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時出現(xiàn)的,而且配置也都非常相似2022-11-11
SpringBoot熔斷機制之CircuitBreaker詳解
這篇文章主要介紹了SpringBoot熔斷機制之CircuitBreaker詳解,SpringBoot的熔斷機制在微服務(wù)架構(gòu)中扮演著重要角色,其中CircuitBreaker是其核心機制之一,用于防止服務(wù)的異常狀態(tài)影響到整個系統(tǒng)的運作,需要的朋友可以參考下2023-10-10
springboot CompletableFuture異步線程池詳解
這篇文章主要介紹了springboot CompletableFuture異步線程池的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04

