Spring 框架为使用 SQL 数据库提供了广泛的支持,从使用直接 JDBC 访问到JdbcTemplate
完整的“对象关系映射”技术,如 Hibernate。 Spring Data提供了额外级别的功能:Repository
直接从接口创建实现并使用约定从您的方法名称生成查询。
Java 的javax.sql.DataSource
接口提供了一种处理数据库连接的标准方法。传统上,“数据源”使用 URL
以及一些凭据来建立数据库连接。
使用内存嵌入式数据库开发应用程序通常很方便。显然,内存数据库不提供持久存储。您需要在应用程序启动时填充数据库,并准备在应用程序结束时丢弃数据。
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>
生产数据库连接也可以使用 pooling 自动配置DataSource
。
DataSource 配置由spring.datasource.*
. 例如,您可以在 中声明以下部分application.properties
:
spring: datasource: url: "jdbc:mysql://localhost/test" username: "dbuser" password: "dbpass"
注意:Spring Boot 可以从 URL 推导出大部分数据库的 JDBC 驱动类。如果需要指定特定的类,可以使用该spring.datasource.driver-class-name
属性。
有关DataSourceProperties
更多受支持的选项,请参阅。无论实际实施如何,这些都是标准选项。spring.datasource.hikari.*
也可以通过使用它们各自的前缀( 、spring.datasource.tomcat.*
、spring.datasource.dbcp2.*
和spring.datasource.oracleucp.*
)来微调特定于实现的设置。有关更多详细信息,请参阅您正在使用的连接池实现的文档。
Spring Boot 使用以下算法来选择特定的实现:
DataSource
可用,我们就使用它。如果您将 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"
SpringJdbcTemplate
和NamedParameterJdbcTemplate
类是自动配置的,您可以@Autowire
将它们直接放入您自己的 bean 中,如下例所示:
@Component public class MyBean { private final JdbcTemplate jdbcTemplate; public MyBean(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void doSomething() { this.jdbcTemplate ... } }
您可以使用属性自定义模板的一些属性spring.jdbc.template.*
,如下例所示:
spring: jdbc: template: max-rows: 500
Java Persistence API 是一种标准技术,可让您将对象“映射”到关系数据库。spring-boot-starter-data-jpa
POM 提供了一种快速入门的方法。它提供以下关键依赖项:
传统上,JPA“实体”类在persistence.xml
文件中指定。使用 Spring Boot,此文件不是必需的,而是使用“实体扫描”。默认情况下,将搜索主配置类下的所有包(带有@EnableAutoConfiguration
或注释的包@SpringBootApplication
)。
@Entity
任何用、@Embeddable
或注释的类都会@MappedSuperclass
被考虑。典型的实体类类似于以下示例:
@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 }
Spring Data JPA存储库是您可以定义以访问数据的接口。JPA 查询是根据您的方法名称自动创建的。例如,一个CityRepository
接口可能会声明一个findAllByState(String state)
方法来查找给定状态的所有城市。
对于更复杂的查询,您可以使用 Spring Data 的Query
注解来注解您的方法。
Spring Data 存储库通常从Repository
orCrudRepository
接口扩展而来。如果您使用自动配置,则从包含您的主要配置类(用@EnableAutoConfiguration
或注释的那个@SpringBootApplication
)的包中搜索存储库。
以下示例显示了一个典型的 Spring Data 存储库接口定义:
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
将使用命名的那个。
默认情况下,仅当您使用嵌入式数据库(H2、HSQL 或 Derby)时,才会自动创建 JPA 数据库。您可以使用spring.jpa.*
属性显式配置 JPA 设置。例如,要创建和删除表,您可以将以下行添加到您的application.properties
:
spring: jpa: hibernate.ddl-auto: "create-drop"
如果您正在运行 Web 应用程序,Spring Boot 默认注册OpenEntityManagerInViewInterceptor
以应用“在视图中打开 EntityManager”模式,以允许在 Web 视图中延迟加载。如果你不想要这种行为,你应该spring.jpa.open-in-view
在false
你的application.properties
.
Spring Data 包括对 JDBC 的存储库支持,并将自动为CrudRepository
. 对于更高级的查询,@Query
提供了注释。
当必要的依赖项位于类路径上时,Spring Boot 将自动配置 Spring Data 的 JDBC 存储库。它们可以通过对spring-boot-starter-data-jdbc
. 如有必要,您可以通过向应用程序添加@EnableJdbcRepositories
注释或子类来控制 Spring Data JDBC 的配置。JdbcConfiguration