Spring Boot笔记 #06# Data
翻译自:https://docs.spring.io/spring-boot/docs/current/reference/html/data.html#data.sql
Spring Boot集成了许多数据技术,包括SQL和NoSQL。
1. SQL Databases
Spring框架为使用SQL数据库提供了广泛的支持,从使用JdbcTemplate直接访问JDBC到完成Hibernate等“对象关系映射(ORM)”技术。Spring数据提供了一个额外的功能级别:直接从接口创建存储库实现,并使用约定从方法名生成查询。Spring Data提供了一个额外的功能级别:直接从接口创建Repository实现,并使用约定(conventions)从方法名生成查询。
1.1. Configure a DataSource
Java的javax.sql.DataSource接口提供了处理数据库连接的标准方法。传统上,一个'DataSource'使用一个URL和一些凭据来建立数据库连接。
更多高级示例,请参见“如何”部分,这些示例通常用于完全控制数据源的配置。
1.1.1. 嵌入式数据库支持
使用内存中的嵌入式数据库开发应用程序通常很方便。显然,内存数据库不提供持久存储。您需要在应用程序启动时填充数据库,并准备在应用程序结束时丢弃数据。
“如何”部分包括一个关于如何初始化数据库的部分。
Spring Boot可以自动配置嵌入式H2、HSQL和Derby数据库。您不需要提供任何连接URL。您只需要包含对要使用的嵌入式数据库的构建依赖项。如果类路径上有多个嵌入式数据库,请设置spring.datasource.embedded-database-connection属性来控制使用哪个数据库。将属性设置为“none”将禁用嵌入式数据库的自动配置。
例如,典型的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,请务必确保禁用数据库的自动关闭(the database’s automatic shutdown)。如果使用H2,那么应该使用DB_CLOSE_ON_EXIT=FALSE。如果使用HSQLDB,应确保未使用shutdown=true。禁用数据库的自动关闭可以让Spring在数据库关闭时进行引导控制,从而确保一旦不再需要访问数据库,就会发生这种情况。
1.1.2. Connection to a Production Database
还可以使用池数据源(a pooling DataSource)自动配置生产数据库连接(Production database connections)。
1.1.3. DataSource Configuration
数据源配置由spring.datasource.*中的外部配置属性控制。例如,您可以在application.properties中声明以下部分:
spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass
您至少应该通过设置spring.datasource.url属性来指定URL。否则,Spring Boot会尝试自动配置嵌入式数据库。
对于要创建的池数据源,我们需要能够验证有效的驱动程序类是否可用,所以我们在做任何事情之前都要检查它。换句话说,如果设置spring.datasource.driver-class-name=com.mysql.jdbc.Driver,那么该类必须是可加载的。
有关更多受支持的选项,请参见DataSourceProperties。这些都是标准选项,无论实际实现如何,它们都会起作用。还可以通过使用各自的前缀(spring.datasource.hikari.*、spring.datasource.tomcat.*、spring.datasource.dbcp2.*和spring.datasource.oracleucp.*)来微调特定于实现的设置。有关更多详细信息,请参阅您正在使用的连接池实现的文档。
例如,如果使用Tomcat连接池,可以自定义许多其他设置,如以下示例所示:
spring.datasource.tomcat.max-wait=10000 spring.datasource.tomcat.max-active=50 spring.datasource.tomcat.test-on-borrow=true
如果没有可用的连接,将连接池设置为在抛出异常之前等待10000ms,将最大连接数限制为50,并在从连接池借用连接之前验证连接。
1.1.4. Supported Connection Pools
Spring Boot使用以下算法来选择特定的实现:
我们更喜欢HikariCP的性能和并发性。如果HikariCP可用,我们总是选择它。
否则,如果Tomcat池数据源可用,我们就使用它。
否则,如果Commons DBCP2可用,我们就使用它。
如果HikariCP、Tomcat和DBCP2都不可用,如果Oracle UCP可用,我们就使用它。
如果使用spring-boot-starter-jdbc或spring-boot-starter-data-jpa “starters”,则会自动获得对HikariCP的依赖关系。
您可以完全绕过该算法,通过设置spring.datasource.type属性指定要使用的连接池。如果在Tomcat容器中运行应用程序,这一点尤其重要,因为Tomcat jdbc是默认提供的。
额外的连接池总是可以使用DataSourceBuilder手动配置。如果您定义自己的DataSource bean,则不会发生自动配置。DataSourceBuilder支持以下连接池:
- HikariCP
- Tomcat pooling Datasource
- Commons DBCP2
- Oracle UCP & OracleDataSource
- Spring Framework’s SimpleDriverDataSource
- H2 JdbcDataSource
- PostgreSQL PGSimpleDataSource
1.3. JPA and Spring Data JPA
Java持久性API(The Java Persistence API)是一种标准技术,允许您将对象“映射”到关系数据库。spring-boot-starter-data-jpa POM提供了快速入门的方法。它提供了以下关键依赖项:
- Hibernate:最流行的JPA实现之一。
- Spring Data JPA:帮助您实现基于JPA的存储库。
- Spring ORM:Spring框架的核心ORM支持。
我们在这里不讨论JPA或Spring Data的太多细节。您可以遵循https://spring.io/的“使用JPA访问数据”指南,并阅读Spring Data JPA和Hibernate参考文档。
1.3.1. Entity Classes
传统上,JPA“实体”类是在persistence.xml文件中指定的。在Spring Boot中,不需要这个文件,而是使用“实体扫描(Entity Scanning)”。默认情况下,将搜索主配置类(用@EnableAutoConfiguration或@SpringBootApplication注释的配置类)下的所有包。
任何带有@Entity、@Embeddeble或@MappedSuperclass注释的类都会被考虑。典型的实体类类似于以下示例:
import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @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 should not 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注释自定义实体扫描位置。请参阅“howto.html”操作指南。
1.3.2. Spring Data JPA Repositories
Spring Data JPA存储库是可以定义用于访问数据的接口。JPA查询是根据方法名自动创建的。例如,CityRepository接口可能会声明一个findAllByState(字符串状态)方法来查找给定状态下的所有城市。
对于更复杂的查询,可以使用Spring Data的Query注解对方法进行注释。
Spring Data存储库通常从Repository或CrudRepository接口扩展而来。如果使用自动配置,存储库将从包含主配置类(用@EnableAutoConfiguration或@SpringBootApplication注释的配置类)的包中向下搜索。
以下示例显示了一个典型的Spring Data存储库接口定义:
import org.springframework.boot.docs.data.sql.jpaandspringdata.entityclasses.City; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.Repository; public interface CityRepository extends Repository<City, Long> { Page<City> findAll(Pageable pageable); City findByNameAndStateAllIgnoringCase(String name, String state); }
Spring Data JPA存储库支持三种不同的引导模式:默认、延迟和懒惰。要启用延迟或懒惰引导,请将spring.data.jpa.repositories.bootstrap-mode属性分别设置为deferred或者lazy。使用延迟或懒惰引导时,自动配置的EntityManagerFactoryBuilder将使用上下文的AsyncTaskExecutor(如果有)作为引导执行器。如果存在多个,将使用名为applicationTaskExecutor的。
我们仅仅触及了Spring Data JPA的皮毛。要了解完整的细节,请参阅Spring Data JPA参考文档。
1.5. Using H2’s Web Console
H2数据库提供了一个基于浏览器的控制台,Spring Boot可以为您自动配置。当满足以下条件时,控制台将自动配置:
- 您正在开发一个基于servlet的web应用程序。
- com.h2database:h2在类路径上。
- 您正在使用Spring Boot的开发工具(Spring Boot’s developer tools)。
如果您没有使用Spring Boot的开发工具,但仍然希望使用H2的控制台,那么可以将spring.h2.console.enabled属性的值配置为true。
H2控制台仅用于开发过程中,因此您应该注意确保spring.h2.console.enabled在生产环境中未设置为true。