輕量級嵌入式資料庫H2的愉快玩耍之旅
- 2019 年 12 月 10 日
- 筆記
1.前言
前面講一些Mybatis特性的時候總是要寫一些例子演示給粉絲。用Mysql或者其他很大的資料庫太重了,因為只是個demo而已。當然也可以使用docker來安裝。但是還是需要依賴一些東西。有沒有非常小巧而且便於攜帶的資料庫,而且能滿足很小場景的資料庫。當然有。今天介紹一種純java編寫而且支援jdbc的嵌入式關係型資料庫H2。有些粉絲對這個感興趣希望能介紹一下,所以寫了這篇文章。
2.H2資料庫特點
- 非常快,開源,支援JDBC API
- 嵌入式和伺服器模式; 記憶體資料庫
- 基於瀏覽器的控制台應用程式
- 佔用空間小,jar只有2MB大小
以上只是官網列出的特點。其實還有跨平台的優勢,支援目前常見的大部分平台。還兼容常見的主流關係型資料庫,比如DB2、Oracle、MS SQL Server、Mysql、PostgreSQL、HSQLDB、Ignite、Derby等。
3.使用場景
基於以上的特點。H2資料庫特別適用於快速構建的小型應用。數據量小的元數據管理,不需要大型資料庫支撐的業務場景都可以用。尤其在應用開發中和單元測試中使用非常方便,而且節省系統資源。而且springboot的依賴池也收錄了H2資料庫。接下來我們通過springboot結合Mybatis來對H2資料庫進行一些特性的講解演示。
4.springboot中使用H2
springboot使用H2資料庫非常簡單。集成BOM下的H2依賴就可以了。這裡為了演示我們還引入了Mybatis。

當然引入依賴還不夠我們還需要對其他參數進行配置。當然這些配置可以通過springboot的 application.yml配置來完成。我們知道H2支援像tomcat一樣內嵌到springboot應用中,也支援獨立的server進程模式。通過不同的配置我們來演示一下。
5.內嵌模式
內嵌模式,就是把在應用中引入H2,啟動應用的同時,會把H2數據服務也啟動,應用中既包含了H2資料庫的服務端,同時應用又作為客戶端來連接H2資料庫。
5.1 記憶體模式連接
記憶體模式就是資料庫文件存在於記憶體中,沒有持久化,當應用進程關閉時資料庫與數據表會消失。為了獨立環境,我們利用springboot的profile特性來隔離不同模式的環境配置。我們訂製一個名稱為application-inner.yml來測試內嵌模式。配置如下:

springboot項目 通過指定 –spring.profiles.active=inner啟動後,輸入http://localhost:8080/h2-console,進入H2數據的控制台:

一定要注意紅框按照你配置文件中的spring.datasource.url來設置,不要用默認值。如果沒有設置密碼直接點connect,設置密碼了輸入。進入下列介面:

因為我們在初始化指定了DDL 、 DML SQL腳本,創建了student表,而且插入了3條數據。所以會呈現出來。證明集成成功。同時我們執行maven 工程的測試包也會成功完成Mybatis 單元測試。但是我們關閉應用後數據會丟失因為這些數據存在於記憶體中。記憶體是會被回收的。不信你注釋掉 spring.datasource.schema、spring.datasource.data 重啟看看。那麼如何持久化呢?這就用到H2嵌入模式了。
5.2 嵌入模式連接
嵌入模式就是資料庫文件存在於應用當前的硬碟內,進行了持久化,當應用進程關閉時資料庫與數據表不會消失。我們只需要將5.1的yml配置中的 spring.datasource.url 改為jdbc:h2:file:E:/H2/mybatis 。然後啟動重新登錄console。注意url要改為jdbc:h2:file:E:/H2/mybatis哦。發現數據都在,然後我們關閉再啟動發現報錯了:

說明資料庫中的數據衝突了。我們注釋掉DDL、DML初始化發現又能啟動了。證明數據持久化了。url 中 file: 後綴你系統的可用路徑,H2就能把數據持久化到該路徑下。
6.獨立進程運行
H2資料庫也可以作為獨立進程進行啟動。下載h2解壓後進入到h2/bin/目錄下會有資料庫驅動包,名叫h2-version.jar,version 為版本號。如果你不需要看源程式碼,就這一個文件就夠用了,啟動資料庫及連接資料庫所用的資源都在裡面了。為了方便,我們將它改名為h2.jar。然後執行以下命令就可以運行了:
java
-cp
h2.jar
org.h2.tools.Server
你也可以通過上述命令 後加參數 -? 來獲取相關的操作命令:

jdbc鏈接為格式為:
jdbc:h2:tcp://{host::localhost}[:{port::9092}]/{database::default}[;<;,user={user:param},password={password:param},{:identifier}={:param}>]
但是這種方式就感覺不到便利性了,所以不多介紹,有興趣可以去看官方文檔。
7.兼容性
開始我們提到H2可以兼容很多資料庫。如何兼容呢?通過url後綴MODE參數來設置,這裡我們假如url為 jdbc:h2:~/test,總結一下自己使用:
- Oracle jdbc:h2:~/test;MODE=Oracle或SQL語句SET MODE Oracle
- Mysql jdbc:h2:~/test;MODE=MySQL;DATABASE_TO_LOWER=TRUE
- PostgreSQL jdbc:h2:~/test;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE
- MSSQLServer jdbc:h2:~/test;MODE=MSSQLServer或SQL語句SET MODE MSSQLServer
其他不一一列舉,但是注意兼容也不是完全兼容,會有一些注意事項和微小的差別。一般不會出現問題。進一步了解可查閱官方文檔和其他資料。
8.總結
今天介紹了H2這種小巧而靈活方便的資料庫。介紹了H2的一些特性並和springboot、mybatis這些框架結合起來進行開發和單元測試。後面還介紹了它的兼容性配置。目的就是為了方便大家在資料庫相關的java開發中快速的進行搭建開發或者測試環境。希望以上的介紹能幫助到你。樣例已經託管到碼云:https://gitee.com/felord/mybatis-test.git 切換到h2分支。多多關注我,有問題可以私信。