SpringBoot是如何使用SQL數(shù)據(jù)庫(kù)的?
一、配置數(shù)據(jù)源
Java 的javax.sql.DataSource接口提供了處理數(shù)據(jù)庫(kù)連接的標(biāo)準(zhǔn)方法。
1.1.嵌入式數(shù)據(jù)庫(kù)支持
使用內(nèi)存中的嵌入式數(shù)據(jù)庫(kù)開(kāi)發(fā)應(yīng)用程序通常很方便。顯然,內(nèi)存數(shù)據(jù)庫(kù)不提供持久存儲(chǔ)。您需要在應(yīng)用程序啟動(dòng)時(shí)填充數(shù)據(jù)庫(kù),并準(zhǔn)備在應(yīng)用程序結(jié)束時(shí)丟棄數(shù)據(jù)。
Spring Boot 可以自動(dòng)配置嵌入式H2、HSQL和Derby數(shù)據(jù)庫(kù)。您無(wú)需提供任何連接 URL。您只需要包含對(duì)要使用的嵌入式數(shù)據(jù)庫(kù)的構(gòu)建依賴(lài)項(xiàng)。如果類(lèi)路徑上有多個(gè)嵌入式數(shù)據(jù)庫(kù),設(shè)置spring.datasource.embedded-database-connection配置屬性來(lái)控制使用哪個(gè)。將該屬性設(shè)置為none禁用嵌入式數(shù)據(jù)庫(kù)的自動(dòng)配置。
如果您在測(cè)試中使用此功能,您可能會(huì)注意到,無(wú)論您使用多少應(yīng)用程序上下文,整個(gè)測(cè)試套件都會(huì)重用同一個(gè)數(shù)據(jù)庫(kù)。如果要確保每個(gè)上下文都有單獨(dú)的嵌入式數(shù)據(jù)庫(kù),則應(yīng)設(shè)置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.連接到生產(chǎn)數(shù)據(jù)庫(kù)
使用DataSource池自動(dòng)配置生產(chǎn)數(shù)據(jù)庫(kù)連接。
1.3.數(shù)據(jù)源配置
spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass
您至少應(yīng)該通過(guò)設(shè)置spring.datasource.url屬性來(lái)指定 URL 。否則,Spring Boot 會(huì)嘗試自動(dòng)配置嵌入式數(shù)據(jù)庫(kù)。
Spring Boot 可以從 URL 中推斷出大多數(shù)數(shù)據(jù)庫(kù)的 JDBC 驅(qū)動(dòng)程序類(lèi)。如果需要指定特定的類(lèi),可以使用該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,因?yàn)樗男阅芎筒l(fā)性。如果 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 數(shù)據(jù)源
如果您將 Spring Boot 應(yīng)用程序部署到應(yīng)用程序服務(wù)器,您可能希望使用應(yīng)用程序服務(wù)器的內(nèi)置功能配置和管理數(shù)據(jù)源,并使用 JNDI 訪問(wèn)它。
spring.datasource.jndi-name=java:jboss/datasources/customers
二、使用 JdbcTemplate
Spring JdbcTemplate和NamedParameterJdbcTemplate類(lèi)是自動(dòng)配置的??梢酝ㄟ^(guò)@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 是一種標(biāo)準(zhǔn)技術(shù),可讓您將對(duì)象“映射”到關(guān)系數(shù)據(jù)庫(kù)。該spring-boot-starter-data-jpa POM提供了上手的快捷方式。它提供以下關(guān)鍵依賴(lài)項(xiàng):
- Hibernate:最流行的 JPA 實(shí)現(xiàn)之一。
- Spring Data JPA:幫助您實(shí)現(xiàn)基于 JPA 的存儲(chǔ)庫(kù)。
- Spring ORM:來(lái)自 Spring 框架的核心 ORM 支持。
3.1.實(shí)體類(lèi)
@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 存儲(chǔ)庫(kù)
Spring Data JPA存儲(chǔ)庫(kù)是您可以定義以訪問(wèn)數(shù)據(jù)的接口。JPA 查詢(xún)是根據(jù)您的方法名稱(chēng)自動(dòng)創(chuàng)建的。
public interface CityRepository extends Repository<City, Long> { Page<City> findAll(Pageable pageable); City findByNameAndStateAllIgnoringCase(String name, String state); }
Spring Data JPA 存儲(chǔ)庫(kù)支持三種不同的引導(dǎo)模式:default, deferred, and lazy。
要啟用延遲或延遲引導(dǎo),請(qǐng)將spring.data.jpa.repositories.bootstrap-mode屬性分別設(shè)置為deferred或lazy。
3.3.創(chuàng)建和刪除 JPA 數(shù)據(jù)庫(kù)
默認(rèn)情況下,僅當(dāng)您使用嵌入式數(shù)據(jù)庫(kù)(H2、HSQL 或 Derby)時(shí),才會(huì)自動(dòng)創(chuàng)建 JPA 數(shù)據(jù)庫(kù)。您可以使用spring.jpa.*屬性顯式配置 JPA 設(shè)置。
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate[globally_quoted_identifiers]=true
3.4.在視圖中打開(kāi) EntityManager
如果您正在運(yùn)行 Web 應(yīng)用程序,Spring Boot 默認(rèn)注冊(cè)O(shè)penEntityManagerInViewInterceptor以應(yīng)用“在視圖中打開(kāi) EntityManager”模式,以允許在 Web 視圖中延遲加載。如果你不希望這種行為,你應(yīng)該設(shè)置spring.jpa.open-in-view=false。
四、Spring Data JDBC
Spring Data 包括對(duì) JDBC 的存儲(chǔ)庫(kù)支持,并將自動(dòng)為CrudRepository. 對(duì)于更高級(jí)的查詢(xún),@Query提供了注釋。
當(dāng)必要的依賴(lài)關(guān)系在類(lèi)路徑上時(shí),Spring Boot 將自動(dòng)配置 Spring Data 的 JDBC 存儲(chǔ)庫(kù)。它們可以添加到您的項(xiàng)目中,并且只依賴(lài)于spring-boot-starter-data-jdbc。
五、使用 H2 的 Web 控制臺(tái)
H2數(shù)據(jù)庫(kù)提供了一個(gè)基于瀏覽器的控制臺(tái),自動(dòng)為您配置。當(dāng)滿足以下條件時(shí),控制臺(tái)會(huì)自動(dòng)配置:
- 您正在開(kāi)發(fā)基于 servlet 的 Web 應(yīng)用程序。
- com.h2database:h2 在類(lèi)路徑上。
- 您正在使用Spring Boot 的開(kāi)發(fā)人員工具。
如果您沒(méi)有使用 Spring Boot 的開(kāi)發(fā)人員工具,但仍想使用 H2 的控制臺(tái),則可以將spring.h2.console.enabled屬性的值配置為true。
H2 控制臺(tái)僅用于在開(kāi)發(fā)期間使用,因此您應(yīng)注意確保spring.h2.console.enabled未將其在生產(chǎn)中設(shè)置為true。
默認(rèn)情況下,控制臺(tái)位于/h2-console。您可以使用該spring.h2.console.path屬性自定義控制臺(tái)的路徑。
六、使用 jOOQ
jOOQ 面向?qū)ο蟛樵?xún) ( jOOQ ) 是Data Geekery 的一款流行產(chǎn)品,它從您的數(shù)據(jù)庫(kù)生成 Java 代碼,并允許您通過(guò)其流暢的 API 構(gòu)建類(lèi)型安全的 SQL 查詢(xún)。商業(yè)版和開(kāi)源版都可以與 Spring Boot 一起使用。
6.1.代碼生成
為了使用 jOOQ 類(lèi)型安全查詢(xún),您需要從數(shù)據(jù)庫(kù)模式生成 Java 類(lèi)。您可以按照jOOQ 用戶手冊(cè)中的說(shuō)明進(jìn)行操作。如果您使用jooq-codegen-maven插件并且您還使用spring-boot-starter-parent“父 POM”,則可以安全地省略插件的<version>標(biāo)簽。您還可以使用 Spring Boot 定義的版本變量(例如h2.version)來(lái)聲明插件的數(shù)據(jù)庫(kù)依賴(lài)項(xiàng)。
<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 是通過(guò)org.jooq.DSLContext接口發(fā)起的。Spring Boot 將DSLContext自動(dòng)配置為 Spring Bean 并將其連接到您的應(yīng)用程序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 會(huì)確定用于數(shù)據(jù)源的 SQL 方言。如果 Spring Boot 無(wú)法檢測(cè)到方言,它會(huì)使用DEFAULT。
Spring Boot 只能自動(dòng)配置 jOOQ 開(kāi)源版本支持的方言。
6.4.自定義 jOOQ
更高級(jí)的自定義可以通過(guò)定義您自己的DefaultConfigurationCustomizer bean來(lái)實(shí)現(xiàn),該 bean 將創(chuàng)建org.jooq.Configuration。這優(yōu)先于自動(dòng)配置應(yīng)用的任何內(nèi)容。
七、使用 R2DBC
Reactive Relational Database Connectivity ( R2DBC ) 項(xiàng)目為關(guān)系數(shù)據(jù)庫(kù)帶來(lái)了反應(yīng)式編程 API。R2DBC io.r2dbc.spi.Connection提供了一種使用非阻塞數(shù)據(jù)庫(kù)連接的標(biāo)準(zhǔn)方法。連接是通過(guò)ConnectionFactory提供的DataSource,類(lèi)似于jdbc。ConnectionFactory配置由spring.r2dbc.*。
spring.r2dbc.url=r2dbc:postgresql://localhost/test spring.r2dbc.username=dbuser spring.r2dbc.password=dbpass
您不需要指定驅(qū)動(dòng)程序類(lèi)名,因?yàn)?Spring Boot 從 R2DBC 的連接工廠發(fā)現(xiàn)中獲取驅(qū)動(dòng)程序。
@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.嵌入式數(shù)據(jù)庫(kù)支持
與JDBC 支持類(lèi)似,Spring Boot 可以自動(dòng)配置嵌入式數(shù)據(jù)庫(kù)以供響應(yīng)式使用。您無(wú)需提供任何連接 URL。您只需要包含對(duì)要使用的嵌入式數(shù)據(jù)庫(kù)的構(gòu)建依賴(lài)項(xiàng)。
<dependency> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-h2</artifactId> <scope>runtime</scope> </dependency>
如果您在測(cè)試中使用此功能,您可能會(huì)注意到,無(wú)論您使用多少應(yīng)用程序上下文,整個(gè)測(cè)試套件都會(huì)重用同一個(gè)數(shù)據(jù)庫(kù)。如果要確保每個(gè)上下文都有單獨(dú)的嵌入式數(shù)據(jù)庫(kù),則應(yīng)設(shè)置spring.r2dbc.generate-unique-name為true。
7.2.使用數(shù)據(jù)庫(kù)客戶端
@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 存儲(chǔ)庫(kù)
Spring Data R2DBC存儲(chǔ)庫(kù)是您可以定義以訪問(wèn)數(shù)據(jù)的接口。查詢(xún)是根據(jù)您的方法名稱(chēng)自動(dòng)創(chuàng)建的。對(duì)于更復(fù)雜的查詢(xún),您可以使用 Spring Data 的Query注解來(lái)注解您的方法。
Spring Data 存儲(chǔ)庫(kù)通常從Repository或CrudRepository接口擴(kuò)展。
public interface CityRepository extends Repository<City, Long> { Mono<City> findByNameAndStateAllIgnoringCase(String name, String state); }
到此這篇關(guān)于SpringBoot是如何使用SQL數(shù)據(jù)庫(kù)的?的文章就介紹到這了,更多相關(guān)SpringBoot使用SQL數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis-Plus如何通過(guò)注解使用TypeHandler
這篇文章主要介紹了MyBatis-Plus如何通過(guò)注解使用TypeHandler,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java Swing中的JButton、JComboBox、JList和JColorChooser組件使用案例
這篇文章主要介紹了Java Swing中的按鈕(JButton)、組合框(JComboBox)、下拉列表(JList)和顏色選擇器(JColorChooser)組件使用案例,需要的朋友可以參考下2014-10-10解決引用slf4j中Logger.info只打印出文字沒(méi)有數(shù)據(jù)的問(wèn)題
這篇文章主要介紹了解決引用slf4j中Logger.info只打印出文字沒(méi)有數(shù)據(jù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12SpringMVC的注解@RequestMapping屬性及使用
這篇文章主要為大家介紹了SpringMVC注解@RequestMapping屬性及使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05玩轉(zhuǎn)spring boot 快速開(kāi)始(1)
玩轉(zhuǎn)spring boot,快速開(kāi)始spring boot學(xué)習(xí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01SpringBoot創(chuàng)建定時(shí)任務(wù)的示例詳解
在Spring Boot中創(chuàng)建定時(shí)任務(wù),通常使用@Scheduled注解,這是Spring框架提供的一個(gè)功能,允許你按照固定的頻率(如每天、每小時(shí)、每分鐘等)執(zhí)行某個(gè)方法,本文給大家介紹了SpringBoot創(chuàng)建定時(shí)任務(wù)的示例,需要的朋友可以參考下2024-04-04Netty分布式flush方法刷新buffer隊(duì)列源碼剖析
這篇文章主要為大家介紹了Netty分布式flush方法刷新buffer隊(duì)列源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03