建立一個【H2DBTest】JavaWeb項目,找到H2數據庫的jar文件,以下圖所示:java
H2數據庫就一個jar文件,這個Jar文件裏面包含了使用JDBC方式鏈接H2數據庫時使用的驅動類,將"h2-1.4.183.jar"加入到【H2DBTest】項目中,以下圖所示:sql
進入到h2\bin目錄,以下圖所示:數據庫
確保H2數據庫使用的8082端口沒有被其餘應用程序佔用,正常啓動以後輸入"http://localhost:8082"進行簡單的測試,以下圖所示:服務器
到此,使用Java操做H2數據庫的測試環境就算是搭建完成了。dom
這種鏈接方式默認狀況下只容許有一個客戶端鏈接到H2數據庫,有客戶端鏈接到H2數據庫以後,此時數據庫文件就會被鎖定,那麼其餘客戶端就沒法再鏈接了。tcp
鏈接語法:jdbc:h2:[file:][<path>]<databaseName>測試
例如:
jdbc:h2:~/test //鏈接位於用戶目錄下的test數據庫
jdbc:h2:file:/data/sample
jdbc:h2:file:E:/H2/gacl(Windows only)ui
編寫測試代碼,以下:spa
package jdbc.conn.h2.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.UUID; /** * <p>ClassName: H2ConnTest1<p> * <p>Description: Java經過JDBC方式鏈接H2數據庫<p> * @author xudp * @version 1.0 V * @createTime 2014-12-18 上午11:22:12 */ public class H2ConnTest1 { //數據庫鏈接URL,當前鏈接的是E:/H2目錄下的gacl數據庫 private static final String JDBC_URL = "jdbc:h2:E:/H2/gacl"; //鏈接數據庫時使用的用戶名 private static final String USER = "gacl"; //鏈接數據庫時使用的密碼 private static final String PASSWORD = "123"; //鏈接H2數據庫時使用的驅動類,org.h2.Driver這個類是由H2數據庫本身提供的,在H2數據庫的jar包中能夠找到 private static final String DRIVER_CLASS="org.h2.Driver"; public static void main(String[] args) throws Exception { // 加載H2數據庫驅動 Class.forName(DRIVER_CLASS); // 根據鏈接URL,用戶名,密碼獲取數據庫鏈接 Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD); Statement stmt = conn.createStatement(); //若是存在USER_INFO表就先刪除USER_INFO表 stmt.execute("DROP TABLE IF EXISTS USER_INFO"); //建立USER_INFO表 stmt.execute("CREATE TABLE USER_INFO(id VARCHAR(36) PRIMARY KEY,name VARCHAR(100),sex VARCHAR(4))"); //新增 stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','大日如來','男')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','青龍','男')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','白虎','男')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','朱雀','女')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','玄武','男')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','蒼狼','男')"); //刪除 stmt.executeUpdate("DELETE FROM USER_INFO WHERE name='大日如來'"); //修改 stmt.executeUpdate("UPDATE USER_INFO SET name='孤傲蒼狼' WHERE name='蒼狼'"); //查詢 ResultSet rs = stmt.executeQuery("SELECT * FROM USER_INFO"); //遍歷結果集 while (rs.next()) { System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("sex")); } //釋放資源 stmt.close(); //關閉鏈接 conn.close(); } }
執行結果以下:code
登陸到H2控制檯當中也能夠看到建立好的USER_INFO表和表裏面的數據,以下圖所示:
這裏須要說明一下使用這種"jdbc:h2:E:/H2/gacl"這種方式鏈接H2數據庫容易遇到的問題,若是已經在H2的WebConsole控制檯中登陸gacl數據庫,以下圖所示:
此時gacl數據庫就會被鎖定,此時經過java代碼鏈接gacl數據庫時就會出現以下的錯誤,如所示:
Exception in thread "main" org.h2.jdbc.JdbcSQLException: Database may be already in use: "E:/H2/gacl.mv.db". Possible solutions: close all other connection(s); use the server mode [90020-183] at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) at org.h2.message.DbException.get(DbException.java:168) at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:108) at org.h2.engine.Database.getPageStore(Database.java:2376) at org.h2.engine.Database.open(Database.java:666) at org.h2.engine.Database.openDatabase(Database.java:266) at org.h2.engine.Database.<init>(Database.java:260) at org.h2.engine.Engine.openSession(Engine.java:60) at org.h2.engine.Engine.openSession(Engine.java:167) at org.h2.engine.Engine.createSessionAndValidate(Engine.java:145) at org.h2.engine.Engine.createSession(Engine.java:128) at org.h2.engine.Engine.createSession(Engine.java:26) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:347) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:108) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:92) at org.h2.Driver.connect(Driver.java:72) at java.sql.DriverManager.getConnection(DriverManager.java:571) at java.sql.DriverManager.getConnection(DriverManager.java:215) at jdbc.conn.h2.test.H2ConnTest1.main(H2ConnTest1.java:33) Caused by: java.lang.IllegalStateException: The file is locked: nio:E:/H2/gacl.mv.db [1.4.183/7] at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:768) at org.h2.mvstore.FileStore.open(FileStore.java:170) at org.h2.mvstore.MVStore.<init>(MVStore.java:346) at org.h2.mvstore.MVStore$Builder.open(MVStore.java:2754) at org.h2.mvstore.db.MVTableEngine$Store.<init>(MVTableEngine.java:162) at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:98) ... 16 more
引發這個錯誤的緣由是由於gacl數據庫對應的文件已經被鎖定了,因此java代碼這邊沒法再訪問,爲了可以讓Java代碼可以正常訪問,必須把WebConsole控制檯那邊的鏈接先斷開,
斷開數據庫鏈接以後,Java代碼這邊就能夠鏈接上去了。
這種鏈接方式就和其餘數據庫相似了,是基於Service的形式進行鏈接的,所以容許多個客戶端同時鏈接到H2數據庫
鏈接語法:jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName>
範例:jdbc:h2:tcp://localhost/~/test
測試代碼以下:
package jdbc.conn.h2.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.UUID; /** * <p>ClassName: H2ConnTest1<p> * <p>Description: Java經過JDBC方式鏈接H2數據庫<p> * @author xudp * @version 1.0 V * @createTime 2014-12-18 上午11:22:12 */ public class H2ConnTest2 { //數據庫鏈接URL,經過使用TCP/IP的服務器模式(遠程鏈接),當前鏈接的是E:/H2目錄下的gacl數據庫 //private static final String JDBC_URL = "jdbc:h2:tcp://localhost/E:/H2/gacl"; //private static final String JDBC_URL = "jdbc:h2:tcp://127.0.0.1/E:/H2/gacl"; private static final String JDBC_URL = "jdbc:h2:tcp://192.168.1.144/data/gacl"; //鏈接數據庫時使用的用戶名 private static final String USER = "gacl"; //鏈接數據庫時使用的密碼 private static final String PASSWORD = "123"; //鏈接H2數據庫時使用的驅動類,org.h2.Driver這個類是由H2數據庫本身提供的,在H2數據庫的jar包中能夠找到 private static final String DRIVER_CLASS="org.h2.Driver"; public static void main(String[] args) throws Exception { // 加載H2數據庫驅動 Class.forName(DRIVER_CLASS); // 根據鏈接URL,用戶名,密碼獲取數據庫鏈接 Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD); Statement stmt = conn.createStatement(); //若是存在USER_INFO表就先刪除USER_INFO表 stmt.execute("DROP TABLE IF EXISTS USER_INFO"); //建立USER_INFO表 stmt.execute("CREATE TABLE USER_INFO(id VARCHAR(36) PRIMARY KEY,name VARCHAR(100),sex VARCHAR(4))"); //新增 stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','大日如來','男')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','青龍','男')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','白虎','男')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','朱雀','女')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','玄武','男')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','蒼狼','男')"); //刪除 stmt.executeUpdate("DELETE FROM USER_INFO WHERE name='大日如來'"); //修改 stmt.executeUpdate("UPDATE USER_INFO SET name='孤傲蒼狼' WHERE name='蒼狼'"); //查詢 ResultSet rs = stmt.executeQuery("SELECT * FROM USER_INFO"); //遍歷結果集 while (rs.next()) { System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("sex")); } //釋放資源 stmt.close(); //關閉鏈接 conn.close(); } }
H2數據庫被稱爲內存數據庫,由於它支持在內存中建立數據庫和表
範例以下:
package jdbc.conn.h2.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.UUID; /** * @ClassName: TestMemH2 * @Description:H2數據庫的內存模式(數據只保存在內存中) * @author: 孤傲蒼狼 * @date: 2014-12-18 下午10:47:01 * */ public class TestMemH2 { //數據庫鏈接URL,經過使用TCP/IP的服務器模式(遠程鏈接),當前鏈接的是內存裏面的gacl數據庫 private static final String JDBC_URL = "jdbc:h2:tcp://localhost/mem:gacl"; //鏈接數據庫時使用的用戶名 private static final String USER = "gacl"; //鏈接數據庫時使用的密碼 private static final String PASSWORD = "123"; //鏈接H2數據庫時使用的驅動類,org.h2.Driver這個類是由H2數據庫本身提供的,在H2數據庫的jar包中能夠找到 private static final String DRIVER_CLASS="org.h2.Driver"; public static void main(String[] args) throws Exception { // 加載H2數據庫驅動 Class.forName(DRIVER_CLASS); // 根據鏈接URL,用戶名,密碼獲取數據庫鏈接 Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD); Statement stmt = conn.createStatement(); //若是存在USER_INFO表就先刪除USER_INFO表 stmt.execute("DROP TABLE IF EXISTS USER_INFO"); //建立USER_INFO表 stmt.execute("CREATE TABLE USER_INFO(id VARCHAR(36) PRIMARY KEY,name VARCHAR(100),sex VARCHAR(4))"); //新增 stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','大日如來','男')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','青龍','男')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','白虎','男')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','朱雀','女')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','玄武','男')"); stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','蒼狼','男')"); //刪除 stmt.executeUpdate("DELETE FROM USER_INFO WHERE name='大日如來'"); //修改 stmt.executeUpdate("UPDATE USER_INFO SET name='孤傲蒼狼' WHERE name='蒼狼'"); //查詢 ResultSet rs = stmt.executeQuery("SELECT * FROM USER_INFO"); //遍歷結果集 while (rs.next()) { System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("sex")); } //釋放資源 stmt.close(); //關閉鏈接 conn.close(); } }
運行結果以下:
注意:若是使用H2數據庫的內存模式,那麼咱們建立的數據庫和表都只是保存在內存中,一旦服務器重啓,那麼內存中的數據庫和表就不存在了。