前言
Springboot 對于數(shù)據(jù)訪問層,不管是 SQL 還是 NOSQL , Spring Boot 底層都是采用 Spring Data 的方式統(tǒng)一處理。Spring Data 是 Spring 家族中與 Spring Boot、Spring Cloud 齊名且知名項目。
事實上,Springboot整合jdbc基本上企業(yè)都不會這么去使用,但是為什么要學呢?我為什么又要寫這么一篇文章呢?也很簡單,就像HelloWorld程序一樣的道理,畢竟jdbc是連接數(shù)據(jù)庫最基本的基礎,不忘基礎,重視基礎,不忘初心,方得始終。
1、創(chuàng)建jdbc工程環(huán)境
創(chuàng)建的時候勾選 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>
如上搭建好之后,應該怎么寫才可以實現(xiàn)數(shù)據(jù)庫的訪問呢?實際上SpringBoot中,我們只需要簡單的配置就可以實現(xiàn)數(shù)據(jù)庫的連接了;
2、編寫配置文件
在application.yml配置文件中,編寫jdbc常規(guī)配置連接
spring:? datasource:? ? username: root? ? url: jdbc:mysql://localhost:3306/ufida? ? password: 123456? ? driver-class-name: com.mysql.jdbc.Driver
在springboot2.X版本中如果 spring.datasource.url 不指定時區(qū)就會報一個 SQLException 錯誤
把上面的URL屬性添加時區(qū),如下即可:
url: jdbc:mysql://localhost:3306/ufida?serverTimezone=UTC
需要注意一點的是:我現(xiàn)在使用的MySQL是5.7版本:
配置之后就可以直接去使用了,因為SpringBoot已經默認幫我們進行了自動配置!是不是感動到哭?
3、test測試類測試
@SpringBootTestclass JdbcbootApplicationTests {//第一步:DI注入數(shù)據(jù)源? ? @Autowired? ? DataSource dataSource;? ? @Test? ? void contextLoads() throws SQLException {//第二步:測試代碼? ? ? ? System.out.println("默認使用的數(shù)據(jù)源:" + dataSource.getClass());? ? ? ? Connection connection = dataSource.getConnection();? ? ? ? System.out.println("獲取的連接:" + connection);? ? ? ? connection.close();? ? }}
輸出結果可以看到默認給我們配置的數(shù)據(jù)源為 class com.zaxxer.hikari.HikariDataSource , 我們并沒有手動配置,到這里,激起了各位的好奇心~不知道你們好不好奇,反正宜春很好奇~,于是乎全局搜索找到數(shù)據(jù)源的所有自動配置都在 : DataSourceProperties 文件下,不要問我為啥知道是在這個文件下,給個圖你也就和我一樣知道了
接下來我們可以來探究下這里自動配置的原理以及能配置哪些屬性了
可以看出?Spring Boot 2.2.2?默認使用 com.zaxxer.hikari.HikariDataSource 數(shù)據(jù)源,而以前版本,比如?Spring Boot 1.5?默認使用 org.apache.tomcat.jdbc.pool.DataSource 作為數(shù)據(jù)源;至于原因也很簡單,聽聞 HikariDataSource 是當前速度最快的數(shù)據(jù)源,相比于傳統(tǒng)的 C3P0 、DBCP、Tomcat jdbc 等連接池更加牛皮,因此springboot把它作為默認的數(shù)據(jù)源了。
既然是自動配置,按照springboot的套路,估計有個 DataSourceXXXAutoConfiguration 的東東,全局搜索一下,
果不其然,有存在一個 DataSourceAutoConfiguration 的類,我們就來進去逛逛
無非這個類中就是一些數(shù)據(jù)源、池什么的自動配置,需要注意一點的就是
可以使用 spring.datasource.type 指定自定義的數(shù)據(jù)源類型,值要使用連接池實現(xiàn)的完全限定名。默認情況下,它是從類路徑自動檢測的,源碼如下:
@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自動配置原理
有了數(shù)據(jù)源 HikariDataSource 就可以拿到數(shù)據(jù)庫連接 java.sql.Connection ,有了連接就相當于可以使用連接和原生的 JDBC 語句來操作數(shù)據(jù)庫進行 crud ,這個點我估計都會想到JdbcTemplate,畢竟好東西都要合理利用!
這里不可以開掛使用第三方數(shù)據(jù)庫操作框架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自動配置原理。不管學什么框架都不是學會配置,更重要的是思想!