目录
SQL 数据库
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 使用以下算法来选择特定的实现:
- 我们更喜欢HikariCP的性能和并发性。如果 HikariCP 可用,我们总是选择它。
- 否则,如果 Tomcat 池
DataSource
可用,我们就使用它。 - 否则,如果Commons DBCP2可用,我们将使用它。
- 如果 HikariCP、Tomcat 和 DBCP2 都不可用,而如果 Oracle UCP 可用,我们就使用它。
连接到 JNDI 数据源
如果您将 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"
使用 JdbcTemplate
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
JPA 和 Spring Data JPA
Java Persistence API 是一种标准技术,可让您将对象“映射”到关系数据库。spring-boot-starter-data-jpa
POM 提供了一种快速入门的方法。它提供以下关键依赖项:
- Hibernate:最流行的 JPA 实现之一。
- Spring Data JPA:帮助您实现基于 JPA 的存储库。
- Spring ORM:来自 Spring Framework 的核心 ORM 支持。
实体类
传统上,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
将使用命名的那个。
创建和删除 JPA 数据库
默认情况下,仅当您使用嵌入式数据库(H2、HSQL 或 Derby)时,才会自动创建 JPA 数据库。您可以使用spring.jpa.*
属性显式配置 JPA 设置。例如,要创建和删除表,您可以将以下行添加到您的application.properties
:
spring:
jpa:
hibernate.ddl-auto: "create-drop"
在视图中打开 EntityManager
如果您正在运行 Web 应用程序,Spring Boot 默认注册OpenEntityManagerInViewInterceptor
以应用“在视图中打开 EntityManager”模式,以允许在 Web 视图中延迟加载。如果你不想要这种行为,你应该spring.jpa.open-in-view
在false
你的application.properties
.
JDBC Repository
Spring Data 包括对 JDBC 的存储库支持,并将自动为CrudRepository
. 对于更高级的查询,@Query
提供了注释。
当必要的依赖项位于类路径上时,Spring Boot 将自动配置 Spring Data 的 JDBC 存储库。它们可以通过对spring-boot-starter-data-jdbc
. 如有必要,您可以通过向应用程序添加@EnableJdbcRepositories
注释或子类来控制 Spring Data JDBC 的配置。JdbcConfiguration