「图文并茂」:SpringBoot 2.X集成 jdbc自动配置原理探究

前言

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自动配置原理。不管学什么框架都不是学会配置,更重要的是思想!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容