入门
初始化工作环境的一个简单方式是在 Spring Tools 中或通过 Spring Initializr 创建一个基于 Spring 的项目。
首先,您需要设置一个正在运行的数据库服务器。请参阅您所用数据库厂商的文档,了解如何配置数据库以进行 JDBC 访问。
要求
Spring Data JDBC 需要 Spring Framework 7.0.9 或更高版本。
在数据库方面,Spring Data JDBC 需要一个方言来对各厂商特有的 SQL 风味抽象出通用的 SQL 功能。Spring Data JDBC 直接支持以下数据库:
-
DB2
-
H2
-
HSQLDB
-
MariaDB
-
Microsoft SQL Server
-
MySQL
-
Oracle
-
PostgreSQL
如果您使用的是其他数据库,您的应用程序将无法启动。方言部分包含了在这种情况下应如何处理的更多细节。
Hello World
要在 STS 中创建一个 Spring 项目:
-
依次选择 File → New → Spring Template Project → Simple Spring Utility Project,在出现提示时按 Yes。然后输入项目名和包名,例如
org.spring.jdbc.example。 -
在
pom.xml文件的dependencies元素中添加以下内容:<dependencies>
<!-- other dependency elements omitted -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jdbc</artifactId>
<version>4.1.1</version>
</dependency>
</dependencies> -
将 pom.xml 中的 Spring 版本更改为:
<spring.version>7.0.9</spring.version> -
在您的
pom.xml中为 Maven 添加以下 Spring Milestone 仓库的位置,使其与<dependencies/>元素处于同一层级:<repositories>
<repository>
<id>spring-milestone</id>
<name>Spring Maven MILESTONE Repository</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
该仓库也可以在此浏览。
日志记录
Spring Data JDBC 自身几乎不进行日志记录。相反,是 JdbcTemplate 执行 SQL 语句的机制提供了日志记录。因此,如果您想查看运行了哪些 SQL 语句,请为 Spring 的 NamedParameterJdbcTemplate 或 MyBatis 启用日志记录。
您可能还希望将日志级别设置为 DEBUG 以查看更多信息。为此,请编辑 application.properties 文件,使其包含以下内容:
logging.level.org.springframework.jdbc=DEBUG
示例仓库
有一个包含若干示例的 GitHub 仓库,您可以下载并动手尝试,以感受该库的工作方式。
配置
Spring Data JDBC 仓库的支持可以通过注解以 Java 配置的方式启用,如下例所示:
@Configuration
@EnableJdbcRepositories 1
class ApplicationConfig extends AbstractJdbcConfiguration { 2
@Bean
DataSource dataSource() { 3
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType(EmbeddedDatabaseType.HSQL).build();
}
@Bean
NamedParameterJdbcOperations namedParameterJdbcOperations(DataSource dataSource) { 4
return new NamedParameterJdbcTemplate(dataSource);
}
@Bean
TransactionManager transactionManager(DataSource dataSource) { 5
return new DataSourceTransactionManager(dataSource);
}
}
@EnableJdbcRepositories为派生自Repository的接口创建实现。AbstractJdbcConfiguration 提供 Spring Data JDBC 所需的各种默认 bean。
创建一个连接到数据库的
DataSource。以下两个 bean 方法需要它。创建 Spring Data JDBC 用于访问数据库的
NamedParameterJdbcOperations。Spring Data JDBC 利用 Spring JDBC 提供的事务管理。
前述示例中的配置类使用 spring-jdbc 的 EmbeddedDatabaseBuilder API 设置了一个内嵌的 HSQL 数据库。然后用 DataSource 来设置 NamedParameterJdbcOperations 和 TransactionManager。最后我们通过 @EnableJdbcRepositories 启用 Spring Data JDBC 仓库。如果未配置基础包,它将使用配置类所在的包。继承 AbstractJdbcConfiguration 可确保注册各种 bean。覆盖其方法可用于自定义设置(见下文)。
使用 Spring Boot 可以进一步简化该配置。对于 Spring Boot,一旦在依赖中包含了 starter spring-boot-starter-data-jdbc,一个 DataSource 就足够了。其他一切都由 Spring Boot 完成。
在这个设置中,有几处可能需要自定义。
方言
Spring Data JDBC 使用 JdbcDialect 接口的实现来封装特定于某个数据库或其 JDBC 驱动程序的行为。默认情况下,AbstractJdbcConfiguration 会通过获取一个连接并注册正确的 JdbcDialect,从数据库配置中判断方言。您可以覆盖 AbstractJdbcConfiguration.jdbcDialect(NamedParameterJdbcOperations) 来自定义方言选择。
如果您使用的数据库没有可用的方言,那么您的应用程序将无法启动。在这种情况下,您需要请求数据库厂商提供 JdbcDialect 实现。或者,您也可以实现自己的 JdbcDialect。
方言由 DialectResolver 从 JdbcOperations 实例解析,通常通过检查 Connection.getMetaData()。
您可以通过 META-INF/spring.factories 注册一个实现了 org.springframework.data.jdbc.core.dialect.DialectResolver$JdbcDialectProvider 的类,让 Spring 自动发现您的 JdbcDialect。DialectResolver 使用 Spring 的 SpringFactoriesLoader 从 classpath 中发现方言提供器实现。为此:
-
实现您自己的
JdbcDialect。 -
实现一个返回该
JdbcDialect的JdbcDialectProvider。 -
在
META-INF下创建一个spring.factories资源来注册该提供器,并通过添加一行
org.springframework.data.jdbc.core.dialect.DialectResolver$JdbcDialectProvider=<您的 JdbcDialectProvider 的全限定名>来完成注册。