SpringBoot是如何使用SQL數據庫的?
一、配置數據源
Java 的javax.sql.DataSource接口提供瞭處理數據庫連接的標準方法。
1.1.嵌入式數據庫支持
使用內存中的嵌入式數據庫開發應用程序通常很方便。顯然,內存數據庫不提供持久存儲。您需要在應用程序啟動時填充數據庫,並準備在應用程序結束時丟棄數據。
Spring Boot 可以自動配置嵌入式H2、HSQL和Derby數據庫。您無需提供任何連接 URL。您隻需要包含對要使用的嵌入式數據庫的構建依賴項。如果類路徑上有多個嵌入式數據庫,設置spring.datasource.embedded-database-connection配置屬性來控制使用哪個。將該屬性設置為none禁用嵌入式數據庫的自動配置。
如果您在測試中使用此功能,您可能會註意到,無論您使用多少應用程序上下文,整個測試套件都會重用同一個數據庫。如果要確保每個上下文都有單獨的嵌入式數據庫,則應設置spring.datasource.generate-unique-name為true。
<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>
1.2.連接到生產數據庫
使用DataSource池自動配置生產數據庫連接。
1.3.數據源配置
spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass
您至少應該通過設置spring.datasource.url屬性來指定 URL 。否則,Spring Boot 會嘗試自動配置嵌入式數據庫。
Spring Boot 可以從 URL 中推斷出大多數數據庫的 JDBC 驅動程序類。如果需要指定特定的類,可以使用該spring.datasource.driver-class-name屬性。
# Tomcat 連接池配置 spring.datasource.tomcat.max-wait=10000 spring.datasource.tomcat.max-active=50 spring.datasource.tomcat.test-on-borrow=true
1.4.支持的連接池
1.我們更喜歡HikariCP,因為它的性能和並發性。如果 HikariCP 可用,我們總是選擇它。
2.否則,如果 Tomcat DataSource池可用,我們將使用它。
3.否則,如果Commons DBCP2可用,我們就使用它。
4.如果 HikariCP、Tomcat 和 DBCP2 都不可用,而 Oracle UCP 可用,我們就使用它。
- HikariCP
- Tomcat pooling Datasource
- Commons DBCP2
- Oracle UCP & OracleDataSource
- Spring Framework’s SimpleDriverDataSource
- H2 JdbcDataSource
- PostgreSQL PGSimpleDataSource
1.5.連接到 JNDI 數據源
如果您將 Spring Boot 應用程序部署到應用程序服務器,您可能希望使用應用程序服務器的內置功能配置和管理數據源,並使用 JNDI 訪問它。
spring.datasource.jndi-name=java:jboss/datasources/customers
二、使用 JdbcTemplate
Spring JdbcTemplate和NamedParameterJdbcTemplate類是自動配置的。可以通過@Autowire直接引用。
@Component public class MyBean { private final JdbcTemplate jdbcTemplate; public MyBean(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void doSomething() { this.jdbcTemplate ... } } 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 ORM:來自 Spring 框架的核心 ORM 支持。
3.1.實體類
@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 }
3.2.Spring Data JPA 存儲庫
Spring Data JPA存儲庫是您可以定義以訪問數據的接口。JPA 查詢是根據您的方法名稱自動創建的。
public interface CityRepository extends Repository<City, Long> { Page<City> findAll(Pageable pageable); City findByNameAndStateAllIgnoringCase(String name, String state); }
Spring Data JPA 存儲庫支持三種不同的引導模式:default, deferred, and lazy。
要啟用延遲或延遲引導,請將spring.data.jpa.repositories.bootstrap-mode屬性分別設置為deferred或lazy。
3.3.創建和刪除 JPA 數據庫
默認情況下,僅當您使用嵌入式數據庫(H2、HSQL 或 Derby)時,才會自動創建 JPA 數據庫。您可以使用spring.jpa.*屬性顯式配置 JPA 設置。
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate[globally_quoted_identifiers]=true
3.4.在視圖中打開 EntityManager
如果您正在運行 Web 應用程序,Spring Boot 默認註冊OpenEntityManagerInViewInterceptor以應用“在視圖中打開 EntityManager”模式,以允許在 Web 視圖中延遲加載。如果你不希望這種行為,你應該設置spring.jpa.open-in-view=false。
四、Spring Data JDBC
Spring Data 包括對 JDBC 的存儲庫支持,並將自動為CrudRepository. 對於更高級的查詢,@Query提供瞭註釋。
當必要的依賴關系在類路徑上時,Spring Boot 將自動配置 Spring Data 的 JDBC 存儲庫。它們可以添加到您的項目中,並且隻依賴於spring-boot-starter-data-jdbc。
五、使用 H2 的 Web 控制臺
H2數據庫提供瞭一個基於瀏覽器的控制臺,自動為您配置。當滿足以下條件時,控制臺會自動配置:
- 您正在開發基於 servlet 的 Web 應用程序。
- com.h2database:h2 在類路徑上。
- 您正在使用Spring Boot 的開發人員工具。
如果您沒有使用 Spring Boot 的開發人員工具,但仍想使用 H2 的控制臺,則可以將spring.h2.console.enabled屬性的值配置為true。
H2 控制臺僅用於在開發期間使用,因此您應註意確保spring.h2.console.enabled未將其在生產中設置為true。
默認情況下,控制臺位於/h2-console。您可以使用該spring.h2.console.path屬性自定義控制臺的路徑。
六、使用 jOOQ
jOOQ 面向對象查詢 ( jOOQ ) 是Data Geekery 的一款流行產品,它從您的數據庫生成 Java 代碼,並允許您通過其流暢的 API 構建類型安全的 SQL 查詢。商業版和開源版都可以與 Spring Boot 一起使用。
6.1.代碼生成
為瞭使用 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>
6.2.使用 DSLContext
jOOQ 提供的 fluent API 是通過org.jooq.DSLContext接口發起的。Spring Boot 將DSLContext自動配置為 Spring Bean 並將其連接到您的應用程序DataSource。要使用DSLContext,您可以註入它。
@Component public class MyBean { private final DSLContext create; public MyBean(DSLContext dslContext) { this.create = 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); } }
6.3.jOOQ SQL 方言
除非spring.jooq.sql-dialect已配置該屬性,否則Spring Boot 會確定用於數據源的 SQL 方言。如果 Spring Boot 無法檢測到方言,它會使用DEFAULT。
Spring Boot 隻能自動配置 jOOQ 開源版本支持的方言。
6.4.自定義 jOOQ
更高級的自定義可以通過定義您自己的DefaultConfigurationCustomizer bean來實現,該 bean 將創建org.jooq.Configuration。這優先於自動配置應用的任何內容。
七、使用 R2DBC
Reactive Relational Database Connectivity ( R2DBC ) 項目為關系數據庫帶來瞭反應式編程 API。R2DBC io.r2dbc.spi.Connection提供瞭一種使用非阻塞數據庫連接的標準方法。連接是通過ConnectionFactory提供的DataSource,類似於jdbc。ConnectionFactory配置由spring.r2dbc.*。
spring.r2dbc.url=r2dbc:postgresql://localhost/test spring.r2dbc.username=dbuser spring.r2dbc.password=dbpass
您不需要指定驅動程序類名,因為 Spring Boot 從 R2DBC 的連接工廠發現中獲取驅動程序。
@Configuration(proxyBeanMethods = false) public class MyR2dbcConfiguration { @Bean public ConnectionFactoryOptionsBuilderCustomizer connectionFactoryPortCustomizer() { return (builder) -> builder.option(ConnectionFactoryOptions.PORT, 5432); } } @Configuration(proxyBeanMethods = false) public class MyPostgresR2dbcConfiguration { @Bean public ConnectionFactoryOptionsBuilderCustomizer postgresCustomizer() { Map<String, String> options = new HashMap<>(); options.put("lock_timeout", "30s"); options.put("statement_timeout", "60s"); return (builder) -> builder.option(PostgresqlConnectionFactoryProvider.OPTIONS, options); }
7.1.嵌入式數據庫支持
與JDBC 支持類似,Spring Boot 可以自動配置嵌入式數據庫以供響應式使用。您無需提供任何連接 URL。您隻需要包含對要使用的嵌入式數據庫的構建依賴項。
<dependency> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-h2</artifactId> <scope>runtime</scope> </dependency>
如果您在測試中使用此功能,您可能會註意到,無論您使用多少應用程序上下文,整個測試套件都會重用同一個數據庫。如果要確保每個上下文都有單獨的嵌入式數據庫,則應設置spring.r2dbc.generate-unique-name為true。
7.2.使用數據庫客戶端
@Component public class MyBean { private final DatabaseClient databaseClient; public MyBean(DatabaseClient databaseClient) { this.databaseClient = databaseClient; } public Flux<Map<String, Object>> someMethod() { return this.databaseClient.sql("select * from user").fetch().all(); } }
7.3.Spring Data R2DBC 存儲庫
Spring Data R2DBC存儲庫是您可以定義以訪問數據的接口。查詢是根據您的方法名稱自動創建的。對於更復雜的查詢,您可以使用 Spring Data 的Query註解來註解您的方法。
Spring Data 存儲庫通常從Repository或CrudRepository接口擴展。
public interface CityRepository extends Repository<City, Long> { Mono<City> findByNameAndStateAllIgnoringCase(String name, String state); }
到此這篇關於SpringBoot是如何使用SQL數據庫的?的文章就介紹到這瞭,更多相關SpringBoot使用SQL數據庫內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot內置數據源的持久化與解決方案
- Java Spring JdbcTemplate基本使用詳解
- SpringBoot環境Druid數據源使用及特點
- SpringBoot快速遷移至Quarkus的方法步驟
- Springboot如何根據實體類生成數據庫表