Spring Boot
对于数据访问层,底层都是采用Spring Data
的方式统一处理。
一、创建集成JDBC的Spring Boot项目
File——>New——>Project,然后选中Spring Initializr,点击Next,来到如下页面,设置组别(Group)和项目名(Artifact)。
点击Next后,来到如下页面,勾选Web
、MySQL
、JDBC
。
pom.xml文件中会引入JDBC的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
二、编写配置文件
在application.yml文件中配置连接JDBC的数据源信息:
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.jdbc.Driver
留心脚下:
在Spring Boot2.x.x版本中,如果在spriing.datasource.url中不指定时区就会报错
在url上添加serverTimezone=UTC
即可:
url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
配置好了之后就可以直接使用了。
三、Test类测试
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDataJdbcApplicationTests {
@Autowired
DataSource dataSource;
@Test
public void contextLoads() throws SQLException {
Connection connection = dataSource.getConnection();
//class com.zaxxer.hikari.HikariDataSource
System.out.println(dataSource);
System.out.println(connection+"====");
connection.close();
}
}
从输出结果中可以看出,此时springboot
默认的数据源是com.zaxxer.hikari.HikariDataSource
。数据源的相关配置都在DataSourceProperties
里。
【问】Spring Boot1.5.x默认使用的数据源是org.apache.tomcat.jdbc.pool.DataSource
,而Spring Boot2.x.x默认使用的数据源是com.zaxxer.hikari.HikariDataSource
。为什么要修改默认的数据源呢?
因为HikariDataSource是当前速度最快的数据源,相比于传统的 C3P0 、DBCP、Tomcat jdbc 等连接池更好。
四、JDBC自动配置原理
Spring boot的自动配置文件都在org.springframework.boot.autoconfigure.jdbc
下:
【1】DataSourceProperties类:里面是可以配置的数据源信息
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
/**
* Fully qualified name of the connection pool implementation to use. By default, it
* is auto-detected from the classpath.
*/
private Class<? extends DataSource> type;
/**
* Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.
*/
private String driverClassName;
/**
* JDBC URL of the database.
*/
private String url;
/**
* Login username of the database.
*/
private String username;
/**
* Login password of the database.
*/
private String password;
/**
* Platform to use in the DDL or DML scripts (such as schema-${platform}.sql or
* data-${platform}.sql).
*/
private String platform = "all";
/**
* Schema (DDL) script resource references.
*/
private List<String> schema;
/**
* Password of the database to execute DDL scripts (if different).
*/
private String schemaPassword;
}
【2】DataSourceAutoConfiguration类:数据源自动配置类
在该类中,将数据源配置信息放入自动配置的容器中。
【3】DataSourceConfiguration类 :该类放了SpringBoot可以配置的数据源。默认使用HikariDataSource
数据源。可以使用spring.datasource.type
来指定自定义的数据源类型
Spring Boot支持的数据源:
org.apache.tomcat.jdbc.pool.DataSource
com.zaxxer.hikari.HikariDataSource
org.apache.commons.dbcp2.BasicDataSource
通过spring.datasource.type属性指定自定义数据源类型,比如druid、 c3p0等
【4】自定义数据源底层源码:通过spring.datasource.type属性指定自定义的数据源,值是要指定的数据源的全类名,从类路径自动检测
/**
* Generic DataSource configuration
**/
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
@Bean
DataSource dataSource(DataSourceProperties properties) {
//使用DataSourceBuilder创建数据源的过程:利用反射创建指定type的数据源,并绑定相关属性
return properties.initializeDataSourceBuilder().build();
}
}
//========================================================
//利用反射创建指定类型的数据源,并绑定相关属性
public T build() {
Class<? extends DataSource> type = this.getType();
DataSource result = (DataSource)BeanUtils.instantiateClass(type);
this.maybeGetDriverClassName();
this.bind(result);
return result;
}
五、JDBCTemplate自动配置原理
经过上面的一番配置,有了数据源HikariDataSource,这时就可以拿到数据库连接java.sql.Connection
,有了连接就相当于可以使用连接和原生的 JDBC 语句来操作数据库进行crud。org.springframework.jdbc.core.JdbcTemplate
是Spring对JDBC轻量级的封装,应该也可以实现crud。
既然是自动配置,那么JdbcTemplate
的自动配置原理是依赖 org.springframework.boot.autoconfigure.jdbc
包下的 。
不出意外,在该包下果然找到了JdbcTemplateAutoConfiguration
。