以spring官方文档为基础,官方地址:Spring Boot_Data
Spring Boot集成了许多数据技术,无论是SQL还是NoSQL。本篇内容为:SQL
Spring框架为使用SQL数据库提供了广泛的支持,从使用JdbcTemplate直接访问JDBC到完成Hibernate等“对象关系映射”技术。Spring Data提供了一种额外的功能:直接从接口创建Repository实现,并使用“从方法名生成查询”的约定。
1. 配置数据源_DataSource
Java的javax.sql.DataSource接口提供了处理数据库连接的标准方法。通常,“DataSource”使用URL和一些凭据来建立数据库连接。
1.1 嵌入式数据库
使用内存中的嵌入式数据库开发应用程序通常很方便。显然,内存中的数据库不提供持久存储。需要在应用程序启动时填充数据库,并准备在应用程序结束时丢弃数据。
Spring Boot可以自动配置嵌入式H2、HSQL和Derby数据库。不需要提供任何连接url。只需要包含对要使用的嵌入式数据库的构建依赖项。如果类路径上有多个嵌入式数据库,则设置spring.datasource.embedded-database-connection属性来控制使用哪一个。将该属性设置为none将禁用嵌入式数据库的自动配置。
如果在测试中使用此特性,可能会注意到,无论使用的应用程序上下文的数量如何,整个测试套件都重用了相同的数据库。如果想确保每个上下文都有一个独立的嵌入式数据库,可设置spring.datasource.generate-unique-name为true。
使用嵌入式数据库的的一个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,请确保禁用了数据库的自动关闭功能。如果使用H2,应该使用DB_CLOSE_ON_EXIT=FALSE。如果使用HSQLDB,应该确保不使用shutdown=true。禁用数据库的自动关闭功能可以让Spring Boot控制何时关闭数据库,从而确保一旦不再需要访问数据库,Spring Boot就会关闭数据库。
1.2 连接到生产数据库
生产数据库连接也可以通过使用池数据源自动配置。
1.3 数据源配置
数据源配置由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 Boot可以从URL推断出大多数数据库的JDBC驱动程序类。如果需要指定一个特定的类,可以使用spring.datasource.driver-class-name属性。
创建池数据源时,需要先验证Driver类是否可用,所以需要进行检查。换句话说,如果设置了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
上述设置表明:如果没可用的连接,在抛出异常之前pool至多等待10000ms,且将最大连接数限制为50,并在从池使用连接之前验证连接。
1.4 支持的连接池
Spring Boot使用以下算法来选择一个特定的实现:
-
更偏向使用HikariCP,因为它的性能和并发性。如果HikariCP可用,Spring Boot总是选择它。
-
否则,如果Tomcat池数据源可用,就使用它。
-
否则,如果Commons DBCP2可用,就使用它。
-
如果HikariCP、Tomcat和DBCP2都不可用,并且Oracle UCP可用,就使用它。
如果使用的是spring-boot-starter-jdbc或spring-boot-starter-data-jpa“启动器”,那么将会自动获得对HikariCP的依赖。
也可以完全绕过该算法,并通过设置spring.datasource.type属性指定要使用的连接池。有一个点需要注意:如果在Tomcat容器中运行应用程序,Tomcat -jdbc是默认提供的。
额外的连接池总是可以使用DataSourceBuilder手动配置。DataSourceBuilder支持以下连接池:
- HikariCP
- Tomcat pooling Datasource
- Commons DBCP2
- Oracle UCP和OracleDataSource
- Spring框架的SimpleDriverDataSource
- H2 JdbcDataSource
- PostgreSQL PGSimpleDataSource
1.5 连接到JNDI数据源
如果将Spring Boot应用程序部署到application Server,你可能希望通过使用application Server的内置特性来配置和管理数据源,并通过使用JNDI来访问它。
spring.datasource.jndi-name属性可作为spring.datasource.url, spring.datasource.username, 和spring.datasource.password的一个代替,它可以实现从特定的JNDI位置访问DataSource。例如,以下例子展示了如何访问JBoss 数据源:
spring.datasource.jndi-name=java:jboss/datasources/customers
2. 使用JdbcTemplate
Spring的JdbcTemplate和NamedParameterJdbcTemplate类是自动配置的,可以直接@Autowire它们到自己的bean中,如下面的例子所示:
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework