一、H2數(shù)據(jù)庫簡介
1、H2是一個用Java開發(fā)的嵌入式數(shù)據(jù)庫,它本身只是一個類庫,可以直接嵌入到應用項目中。
- H2最大的用途在于可以同應用程序打包在一起發(fā)布,這樣可以非常方便地存儲少量結(jié)構(gòu)化數(shù)據(jù)。
- 它的另一個用途是用于單元測試。啟動速度快,而且可以關(guān)閉持久化功能,每一個用例執(zhí)行完隨即還原到初始狀態(tài)。
- H2的第三個用處是作為緩存,作為NoSQL的一個補充。當某些場景下數(shù)據(jù)模型必須為關(guān)系型,可以拿它當Memcached使,作為后端MySQL/Oracle的一個緩沖層,緩存一些不經(jīng)常變化但需要頻繁訪問的數(shù)據(jù),比如字典表、權(quán)限表。不過這樣系統(tǒng)架構(gòu)就會比較復雜了。
2、H2的產(chǎn)品優(yōu)勢:
- 純Java編寫,不受平臺的限制;
- 只有一個jar文件,適合作為嵌入式數(shù)據(jù)庫使用;
- h2提供了一個十分方便的web控制臺用于操作和管理數(shù)據(jù)庫內(nèi)容;
- 功能完整,支持標準SQL和JDBC。麻雀雖小五臟俱全;
- 支持內(nèi)嵌模式、服務器模式和集群。
二、下載和安裝
1、下載,H2數(shù)據(jù)庫下載地址:http://www.h2database.com/html/download.html。
??解壓縮后的目錄結(jié)構(gòu):
????h2
????|—bin
????|??|—h2-1.4.199.jar?????// H2數(shù)據(jù)庫的jar包(驅(qū)動也在里面)
????|??|—h2.bat????????// Windows控制臺啟動腳本
????|??|—h2.sh????????// Linux控制臺啟動腳本
????|??|—h2w.bat???????// Windows控制臺啟動腳本(不帶黑屏窗口)
????|—docs???????????// H2數(shù)據(jù)庫的幫助文檔(內(nèi)有H2數(shù)據(jù)庫的使用手冊)
????|—service?????????// 通過wrapper包裝成服務。
????|—src???????????// H2數(shù)據(jù)庫的源代碼
????|—build.bat????????// windows構(gòu)建腳本
????|—build.sh?????????// linux構(gòu)建腳本
??此時就算“安裝”完成了。
三、運行模式與運行方式
(一)運行模式
H2有三種運行模式。
1、內(nèi)嵌模式(Embedded Mode)
??內(nèi)嵌模式下,應用和數(shù)據(jù)庫同在一個JVM中,通過JDBC進行連接。可持久化,但同時只能一個客戶端連接。內(nèi)嵌模式性能會比較好。
2、服務器模式(Server Mode)
??使用服務器模式和內(nèi)嵌模式一樣,只不過它可以跑在另一個進程里。
3、混合模式
??第一個應用以內(nèi)嵌模式啟動它,對于后面的應用來說它是服務器模式跑著的?;旌夏J绞莾?nèi)嵌模式和服務器模式的組合。第一個應用通過內(nèi)嵌模式與數(shù)據(jù)庫建立連接,同時也作為一個服務器啟動,于是另外的應用(運行在不同的進程或是虛擬機上)可以同時訪問同樣的數(shù)據(jù)。第一個應用的本地連接與嵌入式模式的連接性能一樣的快,而其它連接理論上會略慢。
(二)連接方式
1、以嵌入式(本地)連接方式連接H2數(shù)據(jù)庫
??這種連接方式默認情況下只允許有一個客戶端連接到H2數(shù)據(jù)庫,有客戶端連接到H2數(shù)據(jù)庫之后,此時數(shù)據(jù)庫文件就會被鎖定,那么其他客戶端就無法再連接了。
??連接語法:jdbc:h2:[file:][<path>]<databaseName>
??例如:
????jdbc:h2:~/test????// 連接位于用戶目錄下的test數(shù)據(jù)庫
????jdbc:h2:file:/data/sample
????jdbc:h2:file:E:/H2/gacl(Windows only)
2、使用TCP/IP的服務器模式(遠程連接)方式連接H2數(shù)據(jù)庫(推薦)
??這種連接方式就和其他數(shù)據(jù)庫類似了,是基于Service的形式進行連接的,因此允許多個客戶端同時連接到H2數(shù)據(jù)庫。
??連接語法:jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName>
??范例:jdbc:h2:tcp://localhost/~/test
3、H2數(shù)據(jù)庫的內(nèi)存模式
??(1)、H2數(shù)據(jù)庫被稱為內(nèi)存數(shù)據(jù)庫,因為它支持在內(nèi)存中創(chuàng)建數(shù)據(jù)庫和表。
??(2)、注意:如果使用H2數(shù)據(jù)庫的內(nèi)存模式,那么我們創(chuàng)建的數(shù)據(jù)庫和表都只是保存在內(nèi)存中,一旦服務器重啟,那么內(nèi)存中的數(shù)據(jù)庫和表就不存在了。
四、實例
1、使用Maven項目的依賴。
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
2、H2數(shù)據(jù)庫的操作與mysql的類似。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* @Description: 內(nèi)嵌數(shù)據(jù)庫H2的使用
* @author: zxt
* @time: 2019年6月4日 下午3:30:13
*/
public class H2Test {
/**
* 以嵌入式(本地)連接方式連接H2數(shù)據(jù)庫
*/
private static final String JDBC_URL = "jdbc:h2:E:/Java/H2Test/user";
/**
* 使用TCP/IP的服務器模式(遠程連接)方式連接H2數(shù)據(jù)庫(推薦)
*/
// private static final String JDBC_URL = "jdbc:h2:tcp://10.35.14.122/C:/H2/user";
private static final String USER = "root";
private static final String PASSWORD = "root";
private static final String DRIVER_CLASS = "org.h2.Driver";
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Class.forName(DRIVER_CLASS);
Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
Statement statement = conn.createStatement();
statement.execute("DROP TABLE IF EXISTS USER_INF");
statement.execute("CREATE TABLE USER_INF(id INTEGER PRIMARY KEY, name VARCHAR(100), sex VARCHAR(2))");
statement.executeUpdate("INSERT INTO USER_INF VALUES(1, 'tom', '男') ");
statement.executeUpdate("INSERT INTO USER_INF VALUES(2, 'jack', '女') ");
statement.executeUpdate("INSERT INTO USER_INF VALUES(3, 'marry', '男') ");
statement.executeUpdate("INSERT INTO USER_INF VALUES(4, 'lucy', '男') ");
ResultSet resultSet = statement.executeQuery("select * from USER_INF");
while (resultSet.next()) {
System.out.println(
resultSet.getInt("id") + ", " + resultSet.getString("name") + ", " + resultSet.getString("sex"));
}
statement.close();
conn.close();
}
}