1、SpringData
对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理。Spring Data 也是 Spring 中与 Spring Boot、Spring Cloud 等齐名的知名项目。
Sping Data 官网:https://spring.io/projects/spring-data
数据库相关的启动器可以参考官方文档:https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot-starter
2、整合JDBC
创建工程的时候选用Spring初始化器来创建:
引入相应的模块:
选中这几个模块其实就是pom.xml中导入相应的依赖:
工程建立后,只需要在配置文件中编写数据库相关信息即可使用,application.yaml:
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC
driver-class-name: com.mysql.jdbc.Driver
测试类测试:
@SpringBootTest
class SpringbootMyDataJdbcApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() throws Exception {
System.out.println("类别:"+dataSource.getClass());
Connection connection = dataSource.getConnection();
System.out.println("connection:"+connection);
connection.close();
}
}
控制台输出:
可以看出使用的数据源是com.zaxxer.hikari.HikariDataSource
。
3、源码分析
在spring-boot-autoconfigure
包中,有数据源相关的配置类:
在DataSourceAutoConfiguration
中,有一个数据源配置的内部类:
可以看出SpringBoot支持Hikari
、Tomcat
、Dbcp2
和Generic
数据源,这些数据源配置都在DataSourceConfiguration
类里面,里面有每个数据源组件的定义:
Tomcat数据源:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true)
static class Tomcat {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.tomcat")
org.apache.tomcat.jdbc.pool.DataSource dataSource(DataSourceProperties properties) {
org.apache.tomcat.jdbc.pool.DataSource dataSource = createDataSource(properties, org.apache.tomcat.jdbc.pool.DataSource.class);
DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(properties.determineUrl());
String validationQuery = databaseDriver.getValidationQuery();
if (validationQuery != null) {
dataSource.setTestOnBorrow(true);
dataSource.setValidationQuery(validationQuery);
}
return dataSource;
}
}
Hikari数据源:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(HikariDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true)
static class Hikari {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
HikariDataSource dataSource(DataSourceProperties properties) {
HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
if (StringUtils.hasText(properties.getName())) {
dataSource.setPoolName(properties.getName());
}
return dataSource;
}
}
Dbcp2数据源:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(org.apache.commons.dbcp2.BasicDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.commons.dbcp2.BasicDataSource", matchIfMissing = true)
static class Dbcp2 {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.dbcp2")
org.apache.commons.dbcp2.BasicDataSource dataSource(DataSourceProperties properties) {
return createDataSource(properties, org.apache.commons.dbcp2.BasicDataSource.class);
}
}
Generic数据源:
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
@Bean
DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}
SpringBoot默认是使用com.zaxxer.hikari.HikariDataSource
数据源,因为上面这些数据源组件中,只有Hikari的Bean注册条件完全达到。
Tomcat缺少org.apache.tomcat.jdbc.pool.DataSource.class
,Dbcp2缺少org.apache.commons.dbcp2.BasicDataSource.class
,而Generic是在没有DataSource.class
的前提下才会注册到IOC中,因此默认数据源为Hikari。
如果我们要切换数据源,先导入相关驱动包,然后在配置文件中设置spring.datasource.type
属性值即可。
4、JDBCTemplate
4.1 说明
有了数据源(com.zaxxer.hikari.HikariDataSource
),然后可以拿到数据库连接(java.sql.Connection
),有了连接,就可以使用原生的 JDBC 语句来操作数据库;
即使不使用第三方第数据库操作框架,如 MyBatis等,Spring 本身也对原生的JDBC 做了轻量级的封装,即JdbcTemplate
。
数据库操作的所有 CRUD 方法都在 JdbcTemplate
中。Spring Boot 不仅提供了默认的数据源,同时默认已经配置好了 JdbcTemplate
放在了容器中,程序员只需自己注入即可使用
JdbcTemplate 的自动配置是依赖 org.springframework.boot.autoconfigure.jdbc
包下的 JdbcTemplateConfiguration
类。
4.2 使用
JdbcTemplate主要提供以下几类方法:
1、execute:可以用于执行任何SQL语句,一般用于执行DDL语句;
2、update及batchUpdate:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
3、query及queryForXXX:用于执行查询相关语句;
4、call:用于执行存储过程、函数相关语句。