前言
Springboot 对于数据访问层,不管是 SQL 还是 NOSQL , Spring Boot 底层都是采用 Spring Data 的方式统一处理。Spring Data 是 Spring 家族中与 Spring Boot、Spring Cloud 齐名且知名项目。
事实上,Springboot整合jdbc基本上企业都不会这么去使用,但是为什么要学呢?我为什么又要写这么一篇文章呢?也很简单,就像HelloWorld程序一样的道理,毕竟jdbc是连接数据库最基本的基础,不忘基础,重视基础,不忘初心,方得始终。
1、创建jdbc工程环境
创建的时候勾选 Web 、 jdbc 、 MySQL 即可,
pom.xml 文件默认会有如下依赖:
<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>
如上搭建好之后,应该怎么写才可以实现数据库的访问呢?实际上SpringBoot中,我们只需要简单的配置就可以实现数据库的连接了;
2、编写配置文件
在application.yml配置文件中,编写jdbc常规配置连接
spring: datasource: username: root url: jdbc:mysql://localhost:3306/ufida password: 123456 driver-class-name: com.mysql.jdbc.Driver
在springboot2.X版本中如果 spring.datasource.url 不指定时区就会报一个 SQLException 错误
把上面的URL属性添加时区,如下即可:
url: jdbc:mysql://localhost:3306/ufida?serverTimezone=UTC
需要注意一点的是:我现在使用的MySQL是5.7版本:
配置之后就可以直接去使用了,因为SpringBoot已经默认帮我们进行了自动配置!是不是感动到哭?
3、test测试类测试
@SpringBootTestclass JdbcbootApplicationTests {//第一步:DI注入数据源 @Autowired DataSource dataSource; @Test void contextLoads() throws SQLException {//第二步:测试代码 System.out.println("默认使用的数据源:" + dataSource.getClass()); Connection connection = dataSource.getConnection(); System.out.println("获取的连接:" + connection); connection.close(); }}
输出结果可以看到默认给我们配置的数据源为 class com.zaxxer.hikari.HikariDataSource , 我们并没有手动配置,到这里,激起了各位的好奇心~不知道你们好不好奇,反正宜春很好奇~,于是乎全局搜索找到数据源的所有自动配置都在 : DataSourceProperties 文件下,不要问我为啥知道是在这个文件下,给个图你也就和我一样知道了
接下来我们可以来探究下这里自动配置的原理以及能配置哪些属性了
可以看出 Spring Boot 2.2.2 默认使用 com.zaxxer.hikari.HikariDataSource 数据源,而以前版本,比如 Spring Boot 1.5 默认使用 org.apache.tomcat.jdbc.pool.DataSource 作为数据源;至于原因也很简单,听闻 HikariDataSource 是当前速度最快的数据源,相比于传统的 C3P0 、DBCP、Tomcat jdbc 等连接池更加牛皮,因此springboot把它作为默认的数据源了。
既然是自动配置,按照springboot的套路,估计有个 DataSourceXXXAutoConfiguration 的东东,全局搜索一下,
果不其然,有存在一个 DataSourceAutoConfiguration 的类,我们就来进去逛逛
无非这个类中就是一些数据源、池什么的自动配置,需要注意一点的就是
可以使用 spring.datasource.type 指定自定义的数据源类型,值要使用连接池实现的完全限定名。默认情况下,它是从类路径自动检测的,源码如下:
@Configuration @ConditionalOnMissingBean({DataSource.class}) @ConditionalOnProperty( name = {"spring.datasource.type"} ) static class Generic { Generic() { } @Bean public DataSource dataSource(DataSourceProperties properties) { return properties.initializeDataSourceBuilder().build(); } }
OK, DataSourceAutoConfiguration 的源码就看到这,具体的可自行查看。
4、JdbcTemplate自动配置原理
有了数据源 HikariDataSource 就可以拿到数据库连接 java.sql.Connection ,有了连接就相当于可以使用连接和原生的 JDBC 语句来操作数据库进行 crud ,这个点我估计都会想到JdbcTemplate,毕竟好东西都要合理利用!
这里不可以开挂使用第三方数据库操作框架MyBatis,实际上Spring 本身也对原生的JDBC 做了轻量级的封装,没错就是 org.springframework.jdbc.core.JdbcTemplate 。
既然是自动配置,我们就应该想到 JdbcTemplate 的自动配置原理是依赖 org.springframework.boot.autoconfigure.jdbc 包下的 ,不出意料,该包中果然有 JdbcTemplateAutoConfiguration类。如下
5、Springboot集成jdbc之后CRUD测试
既然能使用jdbcTemplate,就使用它得了,千万记得如下自动注入操作即可
@AutowiredJdbcTemplate jdbcTemplate;
至于CRUD代码这里就不再概述了,本篇文章主要探究Springboot集成jdbc自动配置原理。不管学什么框架都不是学会配置,更重要的是思想!