1. 程式人生 > >帶著萌新看springboot原始碼09(springboot+jdbc)

帶著萌新看springboot原始碼09(springboot+jdbc)

  emmm.....常規開局,繼續說一下廢話,前面簡單的說了一下spring的ioc容器建立原理(花了不少時間去看了別人的部落格+查了不少資料+自己的理解),相信大家對ioc容器有了一個初步的認識了。

  springboot學了這麼久了,也該和資料庫打打交道了。大家還記不記得,以前最初用spring和資料庫打交道的一個東西,JdbcTemplate(就是對jdbc做了一個簡單的封裝,忘記了的小夥伴去看看別人的部落格回顧一下),今天就用springboot如何使用JdbcTemplate和資料庫互動以及基本原理,順便看看原始碼。

  還是由於我個人比較懶,我只用到Dao層,就實現一個add方法,再用一下測試方法;咳咳,不要在意細節。

1.新建一個springboot專案(web+mysql+jdbc+1.5xx版本)

 

2.配置資料來源(也就是常說的連線池)

  這裡用預設的連線池(org.apache.tomcat.jdbc.pool.DataSource),後面可能會說說怎麼用其他比較牛的連線池(比如阿里雲的druid,這個都可以監控你給資料庫發了什麼sql,多長時間等,反正是很多很多的東西),暫時先用預設的。

  配置檔案配置(yml和properties都行,我用yml為例)

 

3.準備兩個.sql檔案(一個是建表的,一個是插入語句的)

  這兩個sql檔案放進類路徑下(就是java資料夾,resource資料夾,以及以前ssm框架編譯之後webapp下的classes資料夾),這sql檔案自己就可以做出來(利用navicat),我就以我的為例(navicat  premium12),我的是試用版,還有幾天就過期了..

  

  

  之後的目錄是這樣的(注意:sql檔名稱預設是有要求的;schema-all.sql是建表語句,data-all.是插入初識資料的語句)

 

 

  好了,然後就可以寫個Dao和資料庫互動了,是不是賊快,嘿嘿。

  下面進行測試,我這極其簡陋的Dao

 

  測試方法(記得測試的時候把資料庫裡面的表刪除哦~還要mysql是開啟狀態的)

 

  是不是很容易,大概的總結一下:準備兩個sql檔案丟到類路徑下----------->yml配置資料來源(連線池)--------------->寫個Dao,然後測試

  接下來,那麼問題來了,為什麼我這麼簡單的配置就能直接用了,不像以前xml配個數據源都要好半天,然後配置JdbcTemplate....好麻煩!

  我以前說過,springboot看原理,入口在xxxAutoConfiguration。

  在IDEA中,ctrl+N全域性搜尋DataSourceAutoConfiguration

 

  最重要的就是這個初始化器幹了什麼,在此之前,可以開啟那個properties類(DataSourceProperties),可以發現這就是一個和配置檔案繫結的類,我們在yml檔案裡配置的資料來源其實就是和這個類繫結的(可以直接在yml檔案裡屬性那裡ctrl+滑鼠左鍵進入)

 

  所以初始化器就是拿到ioc容器和我們配置的資料來源資訊,要去做點什麼事,點進去看看(還記得監聽器的原理吧,只要ioc容器釋出事件,就會觸發事件派發器去遍歷所有的監聽器,執行監聽器裡面的onApplicationEvent方法,我在spring ioc原始碼那裡說了的)

 

 

 

  我們再來看看runSchemaScripts方法是怎麼找到sql檔案的

 

   我可以看看getScripts方法裡面是怎麼找sql檔案的(由下圖可知,sql建表文件預設規則:schema-all.sql或者schema.sql)

 

  由於容器釋出了事件,此監聽器又會自動呼叫onApplicationEvent方法

  

 

  進入runDataScripts方法,其實就跟上面一樣,只是換了一個引數,把schema換成了data,所以插入資料的sql檔案預設是在類路徑下data-all.sql和data.sql

 

  總結:自動配置類DataSourceAutoConfiguration啟動---------->向容器裡匯入DataSourceProperties類(和我們寫的yml繫結),DataSourceInitializer(本質就是一個監聽器)------------->將DataSourceProperties類繫結屬性值和ioc容器都傳入監聽器------------------>監聽器內部有個初始化方法執行建表語句(通過路徑拼接schema-all.sql和schema.sql拿到檔案,利用使用者名稱和密碼連線資料庫執行)----------->向資料庫執行建表語句並且ioc容器釋出事件---------------------->釋出事件又會觸發onApplicationEvent方法--------------------->利用使用者名稱和密碼執行插入資料的sql檔案(內部也是先要進行路徑拼接成類路徑data-all.xml和data.xml,拿到檔案)

  ·還有一點沒說完,就是jdbcTemplate的原理。。。。。下節再說吧。。。