Springboot 使用SQL資料庫
Springboot 使用SQL資料庫
在Spring框架提供了廣泛的支援使用使用SQL資料庫,直接JDBC訪問JdbcTemplate
來完成“物件關係對映”技術,比如Hibernate。Spring Data提供了更多級別的功能:Repository
直接從介面建立實現,並使用約定從方法名稱生成查詢。
摘譯自 官方文件
配置資料來源
Java的javax.sql.DataSource
介面提供了一種使用資料庫連線的標準方法。傳統上,'DataSource'使用URL
一些憑證來建立資料庫連線。
有關更多高階示例,請參閱“操作方法”部分 |
嵌入式資料庫支援
通過使用記憶體中嵌入式資料庫來開發應用程式通常很方便。顯然,記憶體資料庫不提供持久儲存。您需要在應用程式啟動時填充資料庫,並準備在應用程式結束時丟棄資料。
“操作方法”部分包含有關如何初始化資料庫的部分。 |
Spring Boot可以自動配置嵌入式H2, HSQL和Derby資料庫。您無需提供任何連線URL。您只需要包含要使用的嵌入式資料庫的構建依賴項。
如果您在測試中使用此功能,您可能會注意到整個測試套件都會重複使用相同的資料庫,無論您使用的應用程式上下文的數量如何。如果要確保每個上下文都有一個單獨的嵌入式資料庫,則應設定 |
例如,典型的POM依賴關係如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <scope>runtime</scope> </dependency>
您需要依賴於 |
如果由於某種原因,您確實為嵌入式資料庫配置了連線URL,請注意確保禁用資料庫的自動關閉。如果你使用H2,你應該 |
連線到生產資料庫
也可以使用池自動配置生產資料庫連線 DataSource
。Spring Boot使用以下演算法來選擇特定的實現:
- 我們更喜歡HikariCP的效能和併發性。如果HikariCP可用,我們總是選擇它。
- 否則,如果Tomcat池
DataSource
可用,我們將使用它。 - 如果HikariCP和Tomcat池化資料來源都不可用,並且 Commons DBCP2可用,我們就會使用它。
如果您使用spring-boot-starter-jdbc
或spring-boot-starter-data-jpa
“啟動器”,您將自動獲得依賴HikariCP
。
您可以完全繞過該演算法,並通過設定 |
始終可以手動配置其他連線池。如果您定義自己的 |
DataSource配置由外部配置屬性控制 spring.datasource.*
。例如,您可以在以下部分宣告以下部分application.properties
:
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
您至少應該通過設定 |
您通常不需要指定 |
對於 |
有關DataSourceProperties
更多支援的選項,請參閱 。無論實際實施如何,這些都是標準選項。也可以微調實現特定的設定,使用各自的字首(spring.datasource.hikari.*
,spring.datasource.tomcat.*
,和spring.datasource.dbcp2.*
)。有關更多詳細資訊,請參閱您正在使用的連線池實現的文件。
例如,如果使用 Tomcat連線池,則可以自定義許多其他設定,如以下示例所示:
# Number of ms to wait before throwing an exception if no connection is available.
spring.datasource.tomcat.max-wait=10000
# Maximum number of active connections that can be allocated from this pool at the same time.
spring.datasource.tomcat.max-active=50
# Validate the connection before borrowing it from the pool.
spring.datasource.tomcat.test-on-borrow=true
連線到JNDI資料來源
如果將Spring Boot應用程式部署到Application Server,則可能需要使用Application Server的內建功能配置和管理DataSource,並使用JNDI訪問它。
該spring.datasource.jndi-name
屬性可以被用作一個替代spring.datasource.url
,spring.datasource.username
和spring.datasource.password
屬性來訪問DataSource
從一個特定的JNDI位置。例如,以下部分application.properties
顯示瞭如何訪問定義的JBoss AS DataSource
:
spring.datasource.jndi-name=java:jboss/datasources/customers
使用JdbcTemplate
Spring JdbcTemplate
和NamedParameterJdbcTemplate
類是自動配置的,您可以@Autowire
直接將它們放入自己的bean中,如以下示例所示:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
private final JdbcTemplate jdbcTemplate;
@Autowired
public MyBean(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// ...
}
您可以使用spring.jdbc.template.*
屬性自定義模板的某些屬性,如以下示例所示:
spring.jdbc.template.max-rows=500
在 |
JPA和Spring Data JPA
Java Persistence API是一種標準技術,可讓您將物件“對映”到關係資料庫。該spring-boot-starter-data-jpa
POM提供了上手的快捷方式。它提供以下關鍵依賴項:
- Hibernate:最受歡迎的JPA實現之一。
- Spring Data JPA:使實現基於JPA的儲存庫變得容易。
- Spring ORMs:Spring Framework的核心ORM支援。
我們不會在這裡詳細介紹JPA或Spring Data。您可以按照“訪問資料與JPA” 從指導spring.io並宣讀了春天的資料JPA和 Hibernate的參考文件。 |
實體類
傳統上,JPA“實體”類在persistence.xml
檔案中指定。使用Spring Boot,此檔案不是必需的,而是使用“實體掃描”。預設情況下,將搜尋主配置類(註釋為@EnableAutoConfiguration
或者@SpringBootApplication
)下的所有包 。
任何類別標註了@Entity
,@Embeddable
或者@MappedSuperclass
被認為是。典型的實體類類似於以下示例:
package com.example.myapp.domain;
import java.io.Serializable;
import javax.persistence.*;
@Entity
public class City implements Serializable {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String state;
// ... additional members, often include @OneToMany mappings
protected City() {
// no-args constructor required by JPA spec
// this one is protected since it shouldn't be used directly
}
public City(String name, String state) {
this.name = name;
this.state = state;
}
public String getName() {
return this.name;
}
public String getState() {
return this.state;
}
// ... etc
}
您可以使用 |
Spring Data JPA儲存庫
Spring Data JPA儲存庫是您可以定義以訪問資料的介面。JPA查詢是從您的方法名稱自動建立的。例如,CityRepository
介面可能會宣告一個findAllByState(String state)
方法來查詢給定狀態中的所有城市。
對於更復雜的查詢,您可以使用Spring Data的Query
註釋來註釋您的方法 。
Spring Data儲存庫通常從Repository
或 CrudRepository
介面擴充套件 。如果使用自動配置,則會從包含主配置類(帶有@EnableAutoConfiguration
或標註的類)的軟體包中搜索儲存庫@SpringBootApplication
。
以下示例顯示了典型的Spring Data儲存庫介面定義:
package com.example.myapp.domain;
import org.springframework.data.domain.*;
import org.springframework.data.repository.*;
public interface CityRepository extends Repository<City, Long> {
Page<City> findAll(Pageable pageable);
City findByNameAndStateAllIgnoringCase(String name, String state);
}
Spring Data JPA儲存庫支援三種不同的引導模式:default,deferred和lazy。要啟用延遲或延遲引導,請分別設定 spring.data.jpa.repositories.bootstrap-mode
為deferred
或lazy
。使用延遲或延遲引導時,自動配置EntityManagerFactoryBuilder
將使用上下文的非同步任務執行程式(如果有)作為載入程式執行程式。
我們幾乎沒有涉及Spring Data JPA的表面。有關完整的詳細資訊,請參閱Spring Data JPA參考文件。 |
建立和刪除JPA資料庫
預設情況下,僅當您使用嵌入式資料庫(H2,HSQL或Derby)時,才會自動建立JPA資料庫。您可以使用spring.jpa.*
屬性顯式配置JPA設定 。例如,要建立和刪除表,您可以將以下行新增到application.properties
:
spring.jpa.hibernate.ddl-auto=create-drop
Hibernate自己的內部屬性名稱(如果你碰巧記得更好)是 |
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
在前面的示例中的線穿過的一個值true
的 hibernate.globally_quoted_identifiers
屬性設定為休眠實體管理器。
預設情況下,DDL執行(或驗證)將延遲到ApplicationContext
啟動。還有一個spring.jpa.generate-ddl
標誌,但如果Hibernate自動配置處於活動狀態,則不會使用該標誌,因為ddl-auto
設定更精細。
在View中開啟EntityManager
如果您正在執行Web應用程式,則預設情況下Spring Boot會註冊 OpenEntityManagerInViewInterceptor
以應用“在檢視中開啟EntityManager”模式,以允許在Web檢視中進行延遲載入。如果你不希望這種行為,你應該設定spring.jpa.open-in-view
到 false
你application.properties
。
Spring Data JDBC
Spring Data包含對JDBC的儲存庫支援,並將自動為方法生成SQL CrudRepository
。對於更高階的查詢,@Query
提供了註釋。
當必要的依賴項在類路徑上時,Spring Boot將自動配置Spring Data的JDBC儲存庫。它們可以通過單一依賴項新增到專案中spring-boot-starter-data-jdbc
。如有必要,您可以通過嚮應用程式新增@EnableJdbcRepositories
註釋或 JdbcConfiguration
子類來控制Spring Data JDBC的配置。
有關Spring Data JDBC的完整詳細資訊,請參閱 參考文件。 |
使用H2的Web控制檯
該H2資料庫提供了一個 基於瀏覽器的控制檯是春天開機即可自動為您配置。滿足以下條件時,將自動配置控制檯:
- 您正在開發基於servlet的Web應用程式。
com.h2database:h2
在類路徑上。- 您正在使用Spring Boot的開發人員工具。
如果您沒有使用Spring Boot的開發人員工具但仍想使用H2的控制檯,則可以 |
H2控制檯僅用於開發期間,因此您應該注意確保 |
更改H2控制檯的路徑
預設情況下,控制檯可用於/h2-console
。您可以使用該spring.h2.console.path
屬性自定義控制檯的路徑。
使用jOOQ
Java面向物件查詢(jOOQ)是Data Geekery的一個流行產品, 它從您的資料庫生成Java程式碼,並允許您通過其流暢的API構建型別安全的SQL查詢。商業版和開源版都可以與Spring Boot一起使用。
程式碼生成
要使用jOOQ型別安全查詢,您需要從資料庫模式生成Java類。您可以按照jOOQ使用者手冊中的說明進行 操作。如果您使用該 jooq-codegen-maven
外掛並且還使用spring-boot-starter-parent
“父POM”,則可以安全地省略外掛的<version>
標籤。您還可以使用Spring Boot定義的版本變數(例如h2.version
)來宣告外掛的資料庫依賴性。以下清單顯示了一個示例:
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<executions>
...
</executions>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${h2.version}</version>
</dependency>
</dependencies>
<configuration>
<jdbc>
<driver>org.h2.Driver</driver>
<url>jdbc:h2:~/yourdatabase</url>
</jdbc>
<generator>
...
</generator>
</configuration>
</plugin>
使用DSLContext
jOOQ提供的流暢API通過org.jooq.DSLContext
介面啟動。Spring Boot自動配置DSLContext
為Spring Bean並將其連線到您的應用程式DataSource
。要使用DSLContext
,您可以使用@Autowire
它,如以下示例所示:
@Component
public class JooqExample implements CommandLineRunner {
private final DSLContext create;
@Autowired
public JooqExample(DSLContext dslContext) {
this.create = dslContext;
}
}
jOOQ手冊傾向於使用一個名為 |
然後,您可以使用它DSLContext
來構建查詢,如以下示例所示:
public List<GregorianCalendar> authorsBornAfter1980() {
return this.create.selectFrom(AUTHOR)
.where(AUTHOR.DATE_OF_BIRTH.greaterThan(new GregorianCalendar(1980, 0, 1)))
.fetch(AUTHOR.DATE_OF_BIRTH);
}
jOOQ SQL方言
除非spring.jooq.sql-dialect
已配置該屬性,否則Spring Boot會確定要用於資料來源的SQL方言。如果Spring Boot無法檢測到方言,它會使用DEFAULT
。
Spring Boot只能自動配置開源版本jOOQ支援的方言。 |
自定義jOOQ
通過定義自己的@Bean
定義可以實現更高階的自定義,這些定義在Configuration
建立jOOQ時使用。您可以為以下jOOQ型別定義bean:
ConnectionProvider
ExecutorProvider
TransactionProvider
RecordMapperProvider
RecordUnmapperProvider
RecordListenerProvider
ExecuteListenerProvider
VisitListenerProvider
TransactionListenerProvider
org.jooq.Configuration
@Bean
如果要完全控制jOOQ配置,也可以建立自己的。