H2介紹
H2是一個開源的嵌入式數據庫引擎,采用java語言編寫,不受平台的限制,同時H2提供了一個十分方便的web控制台用於操作和管理數據庫內容。
H2還提供兼容模式,可以兼容一些主流的數據庫,因此采用H2作為開發期的數據庫非常方便。
官網地址:http://www.h2database.com
H2是Java SQL數據庫。H2的主要特點是:
- 非常快,開源,JDBC API
- 嵌入式和服務器模式; 內存數據庫
- 基於瀏覽器的Console應用
- 占地面積小:大約2 MB的jar文件大小
H2用途
H2最大的用途在於可以同應用程序打包在一起發布,這樣可以非常方便地存儲少量結構化數據。
它的另一個用途是用於單元測試。啟動速度快,而且可以關閉持久化功能,每一個用例執行完隨即還原到初始狀態。
H2的第三個用處是作為緩存,作為NoSQL的一個補充。當某些場景下數據模型必須為關系型,可以拿它當Memcached使,作為后端MySQL/Oracle的一個緩沖層,緩存一些不經常變化但需要頻繁訪問的數據,比如字典表、權限表。不過這樣系統架構就會比較復雜了。
H2運行模式
H2支持三種不同的運行模式,以適用於更多不同的應用場景。
1、嵌入式模式:
嵌入式模式下,應用與H2運行於同一個JVM中,H2被應用啟動。該模式也是性能最好的模式,也是官方推薦的模式。
2、服務器模式
服務器模式下,H2被H2 Server啟動(獨立於應用的JVM),應用與數據分離,應用使用遠程連接(如JDBC)訪問數據庫。類似於傳統數據庫的部署,服務器可以與應用部署與同一台機器,也可以部署與另一台機器。
實際上,H2 Server本身也是使用嵌入式模式來啟動運行H2 Database的。顯然,由於服務器模式是通過遠程連接訪問數據,其性能也要低於嵌入式模式。
3、混合模式
該模式是嵌入式模式與混合模式的融合。一個應用啟動嵌入式模式的H2 Database,其他應用可以將其作為服務器模式來遠程訪問。
H2簡單使用
1、H2數據庫下載,打開官網(http://www.h2database.com)下載

2、解壓下載包,即可使用,解壓后目錄如下
h2
|---bin
| |---h2-1.1.116.jar //H2數據庫的jar包(驅動也在里面)
| |---h2.bat //Windows控制台啟動腳本
| |---h2.sh //Linux控制台啟動腳本
| |---h2w.bat //Windows控制台啟動腳本(不帶黑屏窗口)
|---docs //H2數據庫的幫助文檔(內有H2數據庫的使用手冊)
|---service //通過wrapper包裝成服務。
|---src //H2數據庫的源代碼
|---build.bat //windows構建腳本
|---build.sh //linux構建腳本
3、windows環境下運行h2.bat,linux環境下運行h2.sh,打開控制台
4、windows環境下,運行文件后自動打開瀏覽器,地址:http://本地ip:8082

5、選擇中文語言,並點擊連接,自動創建test數據庫,數據庫文件在~目錄中,~代表用戶自己目錄

6、復制測試腳本sql,並執行

7、運行結果如下:

H2使用JDBC連接
1、運行
2、新建maven項目,引入jar包
1 <!-- https://mvnrepository.com/artifact/com.h2database/h2 --> 2 <dependency> 3 <groupId>com.h2database</groupId> 4 <artifactId>h2</artifactId> 5 <version>1.4.199</version> 6 </dependency>
3、編輯JDBC測試類
1 package com.test.hsqldb; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.sql.Statement; 9 10 /** 11 * Hello world! 12 * 13 */ 14 public class App { 15 public static void main(String[] args) throws SQLException, ClassNotFoundException { 16 17 // 加載H2 DB的JDBC驅動 18 Class.forName("org.h2.Driver"); 19 20 // 鏈接數據庫,自動在~創建數據庫test,得到聯接對象 connection 21 String url = "jdbc:h2:~/test"; 22 Connection con = DriverManager.getConnection(url, "sa", ""); 23 24 // 新建數據表 25 String ctreateTable = "DROP TABLE test IF EXISTS; create table test(id integer,name VARCHAR(22) )"; 26 Statement createStatement = con.createStatement(); 27 long f1 = createStatement.executeUpdate(ctreateTable); 28 System.out.println("創建表:" + f1); 29 30 // 插入數據 31 String insertSql = "INSERT INTO test VALUES(1,'小明')"; 32 Statement insertStatement = con.createStatement(); 33 long f2 = insertStatement.executeUpdate(insertSql); 34 System.out.println("插入數據:" + f2); 35 36 // 查詢數據 37 String selectSql = "select id,name from test"; 38 PreparedStatement prepareStatement = con.prepareStatement(selectSql); 39 // 發送SQL 返回一個ResultSet 40 ResultSet rs = prepareStatement.executeQuery(); 41 42 // 編歷結果集 43 while (rs.next())// 從數據庫的取一行數據,是否還有下一行 44 { 45 int id = rs.getInt(1); // 從1開始 46 String name = rs.getString(2); 47 System.out.println("id:" + id + "\t名稱:" + name); 48 } 49 50 // 關閉連接 51 con.close(); 52 53 } 54 }
4、運行測試類,結果如下:

