1. 程式人生 > >Springboot 使用SQL資料庫

Springboot 使用SQL資料庫

Springboot 使用SQL資料庫

Spring框架提供了廣泛的支援使用使用SQL資料庫,直接JDBC訪問JdbcTemplate來完成“物件關係對映”技術,比如Hibernate。Spring Data提供了更多級別的功能:Repository直接從介面建立實現,並使用約定從方法名稱生成查詢。

摘譯自 官方文件

配置資料來源

Java的javax.sql.DataSource介面提供了一種使用資料庫連線的標準方法。傳統上,'DataSource'使用URL一些憑證來建立資料庫連線。

[小費]

有關更多高階示例,請參閱“操作方法”部分

,通常是為了完全控制DataSource的配置。

嵌入式資料庫支援

通過使用記憶體中嵌入式資料庫來開發應用程式通常很方便。顯然,記憶體資料庫不提供持久儲存。您需要在應用程式啟動時填充資料庫,並準備在應用程式結束時丟棄資料。

[小費]

“操作方法”部分包含有關如何初始化資料庫的部分

Spring Boot可以自動配置嵌入式H2, HSQLDerby資料庫。您無需提供任何連線URL。您只需要包含要使用的嵌入式資料庫的構建依賴項。

[注意]

如果您在測試中使用此功能,您可能會注意到整個測試套件都會重複使用相同的資料庫,無論您使用的應用程式上下文的數量如何。如果要確保每個上下文都有一個單獨的嵌入式資料庫,則應設定spring.datasource.generate-unique-name

true

例如,典型的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>
[注意]

您需要依賴於spring-jdbc自動配置嵌入式資料庫。在這個例子中,它被傳遞過來spring-boot-starter-data-jpa

[小費]

如果由於某種原因,您確實為嵌入式資料庫配置了連線URL,請注意確保禁用資料庫的自動關閉。如果你使用H2,你應該DB_CLOSE_ON_EXIT=FALSE這樣做。如果使用HSQLDB,則應確保shutdown=true未使用HSQLDB 。禁用資料庫的自動關閉可以在資料庫關閉時進行Spring Boot控制,從而確保在不再需要訪問資料庫時發生。

連線到生產資料庫

也可以使用池自動配置生產資料庫連線 DataSource。Spring Boot使用以下演算法來選擇特定的實現:

  1. 我們更喜歡HikariCP的效能和併發性。如果HikariCP可用,我們總是選擇它。
  2. 否則,如果Tomcat池DataSource可用,我們將使用它。
  3. 如果HikariCP和Tomcat池化資料來源都不可用,並且 Commons DBCP2可用,我們就會使用它。

如果您使用spring-boot-starter-jdbcspring-boot-starter-data-jpa“啟動器”,您將自動獲得依賴HikariCP

[注意]

您可以完全繞過該演算法,並通過設定spring.datasource.type屬性指定要使用的連線池。如果您在Tomcat容器中執行應用程式tomcat-jdbc(預設情況下提供),這一點尤為重要。

[小費]

始終可以手動配置其他連線池。如果您定義自己的DataSourcebean,則不會進行自動配置。

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
[注意]

您至少應該通過設定spring.datasource.url 屬性來指定URL 。否則,Spring Boot會嘗試自動配置嵌入式資料庫。

[小費]

您通常不需要指定driver-class-name,因為Spring Boot可以從大多數資料庫中推斷出它url

[注意]

對於DataSource要建立的池,我們需要能夠驗證有效的 Driver類是否可用,因此我們在執行任何操作之前檢查它。換句話說,如果你設定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.urlspring.datasource.usernamespring.datasource.password 屬性來訪問DataSource從一個特定的JNDI位置。例如,以下部分application.properties顯示瞭如何訪問定義的JBoss AS DataSource

spring.datasource.jndi-name=java:jboss/datasources/customers

使用JdbcTemplate

Spring JdbcTemplateNamedParameterJdbcTemplate類是自動配置的,您可以@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
[注意]

NamedParameterJdbcTemplate重複使用相同的JdbcTemplate幕後情況。如果JdbcTemplate定義了多個且沒有主要候選項, NamedParameterJdbcTemplate則不會自動配置。

 JPA和Spring Data JPA

Java Persistence API是一種標準技術,可讓您將物件“對映”到關係資料庫。該spring-boot-starter-data-jpaPOM提供了上手的快捷方式。它提供以下關鍵依賴項:

  • 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

}
[小費]

您可以使用@EntityScan註釋自定義實體掃描位置。請參閱“ 第84.4節 ” ,“從Spring配置中分離@Entity定義” “ 操作方法”

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-modedeferredlazy。使用延遲或延遲引導時,自動配置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自己的內部屬性名稱(如果你碰巧記得更好)是hibernate.hbm2ddl.auto。您可以使用spring.jpa.properties.*(在將它們新增到實體管理器之前剝離字首)來設定它以及其他Hibernate本機屬性。以下行顯示了為Hibernate設定JPA屬性的示例:

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到 falseapplication.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資料庫提供了一個 基於瀏覽器的控制檯是春天開機即可自動為您配置。滿足以下條件時,將自動配置控制檯:

[小費]

如果您沒有使用Spring Boot的開發人員工具但仍想使用H2的控制檯,則可以spring.h2.console.enabled使用值配置屬性true

[注意]

H2控制檯僅用於開發期間,因此您應該注意確保spring.h2.console.enabledtrue在生產中設定。

更改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手冊傾向於使用一個名為createhold的變數DSLContext

然後,您可以使用它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配置,也可以建立自己的。