一、搭建测试环境和项目

1.1、搭建JavaWeb测试项目

  创建一个【H2DBTest】JavaWeb项目,找到H2数据库的jar文件,如下图所示:

  

  H2数据库就一个jar文件,这个Jar文件里面包含了使用JDBC方式连接H2数据库时使用的驱动类,将"h2-1.4.183.jar"加入到【H2DBTest】项目中,如下图所示:

  

1.2、开启H2数据库

  进入到h2\bin目录,如下图所示:

  

  确保H2数据库使用的8082端口没有被其他应用程序占用,正常启动之后输入"http://localhost:8082"进行简单的测试,如下图所示:

  

  到此,使用Java操作H2数据库的测试环境就算是搭建完成了。

二、在Java中操作H2数据库

2.1、以嵌入式(本地)连接方式连接H2数据库

  这种连接方式默认情况下只允许有一个客户端连接到H2数据库,有客户端连接到H2数据库之后,此时数据库文件就会被锁定,那么其他客户端就无法再连接了。

  连接语法:jdbc:h2:[file:][<path>]<databaseName>

  例如:
    jdbc:h2:~/test //连接位于用户目录下的test数据库
    jdbc:h2:file:/data/sample
    jdbc:h2:file:E:/H2/gacl(Windows only)

  编写测试代码,如下:

 1 /**2  * 3  */4 package jdbc.conn.h2.test;5 6 import java.sql.Connection;7 import java.sql.DriverManager;8 import java.sql.ResultSet;9 import java.sql.Statement;
10 import java.util.UUID;
11
12 /**
13  * <p>ClassName: H2ConnTest1<p>
14  * <p>Description: Java通过JDBC方式连接H2数据库<p>
15  * @author xudp
16  * @version 1.0 V
17  * @createTime 2014-12-18 上午11:22:12
18  */
19 public class H2ConnTest1 {
20     //数据库连接URL,当前连接的是E:/H2目录下的gacl数据库
21     private static final String JDBC_URL = "jdbc:h2:E:/H2/gacl";
22     //连接数据库时使用的用户名
23     private static final String USER = "gacl";
24     //连接数据库时使用的密码
25     private static final String PASSWORD = "123";
26     //连接H2数据库时使用的驱动类,org.h2.Driver这个类是由H2数据库自己提供的,在H2数据库的jar包中可以找到
27     private static final String DRIVER_CLASS="org.h2.Driver";
28
29     public static void main(String[] args) throws Exception {
30         // 加载H2数据库驱动
31         Class.forName(DRIVER_CLASS);
32         // 根据连接URL,用户名,密码获取数据库连接
33         Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
34         Statement stmt = conn.createStatement();
35         //如果存在USER_INFO表就先删除USER_INFO表
36         stmt.execute("DROP TABLE IF EXISTS USER_INFO");
37         //创建USER_INFO表
38         stmt.execute("CREATE TABLE USER_INFO(id VARCHAR(36) PRIMARY KEY,name VARCHAR(100),sex VARCHAR(4))");
39         //新增
40         stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','大日如来','男')");
41         stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','青龙','男')");
42         stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','白虎','男')");
43         stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','朱雀','女')");
44         stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','玄武','男')");
45         stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','苍狼','男')");
46         //删除
47         stmt.executeUpdate("DELETE FROM USER_INFO WHERE name='大日如来'");
48         //修改
49         stmt.executeUpdate("UPDATE USER_INFO SET name='孤傲苍狼' WHERE name='苍狼'");
50         //查询
51         ResultSet rs = stmt.executeQuery("SELECT * FROM USER_INFO");
52         //遍历结果集
53         while (rs.next()) {
54             System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("sex"));
55         }
56         //释放资源
57         stmt.close();
58         //关闭连接
59         conn.close();
60     }
61 }

  执行结果如下:

  

  登录到H2控制台当中也可以看到创建好的USER_INFO表和表里面的数据,如下图所示:

  

  这里需要说明一下使用这种"jdbc:h2:E:/H2/gacl"这种方式连接H2数据库容易遇到的问题,如果已经在H2的WebConsole控制台中登录gacl数据库,如下图所示:

  

  此时gacl数据库就会被锁定,此时通过java代码连接gacl数据库时就会出现如下的错误,如所示:

 1 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]2     at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)3     at org.h2.message.DbException.get(DbException.java:168)4     at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:108)5     at org.h2.engine.Database.getPageStore(Database.java:2376)6     at org.h2.engine.Database.open(Database.java:666)7     at org.h2.engine.Database.openDatabase(Database.java:266)8     at org.h2.engine.Database.<init>(Database.java:260)9     at org.h2.engine.Engine.openSession(Engine.java:60)
10     at org.h2.engine.Engine.openSession(Engine.java:167)
11     at org.h2.engine.Engine.createSessionAndValidate(Engine.java:145)
12     at org.h2.engine.Engine.createSession(Engine.java:128)
13     at org.h2.engine.Engine.createSession(Engine.java:26)
14     at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:347)
15     at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:108)
16     at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:92)
17     at org.h2.Driver.connect(Driver.java:72)
18     at java.sql.DriverManager.getConnection(DriverManager.java:571)
19     at java.sql.DriverManager.getConnection(DriverManager.java:215)
20     at jdbc.conn.h2.test.H2ConnTest1.main(H2ConnTest1.java:33)
21 Caused by: java.lang.IllegalStateException: The file is locked: nio:E:/H2/gacl.mv.db [1.4.183/7]
22     at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:768)
23     at org.h2.mvstore.FileStore.open(FileStore.java:170)
24     at org.h2.mvstore.MVStore.<init>(MVStore.java:346)
25     at org.h2.mvstore.MVStore$Builder.open(MVStore.java:2754)
26     at org.h2.mvstore.db.MVTableEngine$Store.<init>(MVTableEngine.java:162)
27     at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:98)
28     ... 16 more

   引起这个错误的原因是因为gacl数据库对应的文件已经被锁定了,所以java代码这边无法再访问,为了能够让Java代码能够正常访问,必须把WebConsole控制台那边的连接先断开,

  

  断开数据库连接之后,Java代码这边就可以连接上去了。

2.2、使用TCP/IP的服务器模式(远程连接)方式连接H2数据库(推荐)

  这种连接方式就和其他数据库类似了,是基于Service的形式进行连接的,因此允许多个客户端同时连接到H2数据库

  连接语法:jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName>
  范例:jdbc:h2:tcp://localhost/~/test

  测试代码如下:

 1 /**2  * 3  */4 package jdbc.conn.h2.test;5 6 import java.sql.Connection;7 import java.sql.DriverManager;8 import java.sql.ResultSet;9 import java.sql.Statement;
10 import java.util.UUID;
11
12 /**
13  * <p>ClassName: H2ConnTest1<p>
14  * <p>Description: Java通过JDBC方式连接H2数据库<p>
15  * @author xudp
16  * @version 1.0 V
17  * @createTime 2014-12-18 上午11:22:12
18  */
19 public class H2ConnTest2 {
20     //数据库连接URL,通过使用TCP/IP的服务器模式(远程连接),当前连接的是E:/H2目录下的gacl数据库
21     //private static final String JDBC_URL = "jdbc:h2:tcp://localhost/E:/H2/gacl";
22     //private static final String JDBC_URL = "jdbc:h2:tcp://127.0.0.1/E:/H2/gacl";
23     private static final String JDBC_URL = "jdbc:h2:tcp://192.168.1.144/data/gacl";
24     //连接数据库时使用的用户名
25     private static final String USER = "gacl";
26     //连接数据库时使用的密码
27     private static final String PASSWORD = "123";
28     //连接H2数据库时使用的驱动类,org.h2.Driver这个类是由H2数据库自己提供的,在H2数据库的jar包中可以找到
29     private static final String DRIVER_CLASS="org.h2.Driver";
30
31     public static void main(String[] args) throws Exception {
32         // 加载H2数据库驱动
33         Class.forName(DRIVER_CLASS);
34         // 根据连接URL,用户名,密码获取数据库连接
35         Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
36         Statement stmt = conn.createStatement();
37         //如果存在USER_INFO表就先删除USER_INFO表
38         stmt.execute("DROP TABLE IF EXISTS USER_INFO");
39         //创建USER_INFO表
40         stmt.execute("CREATE TABLE USER_INFO(id VARCHAR(36) PRIMARY KEY,name VARCHAR(100),sex VARCHAR(4))");
41         //新增
42         stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','大日如来','男')");
43         stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','青龙','男')");
44         stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','白虎','男')");
45         stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','朱雀','女')");
46         stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','玄武','男')");
47         stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','苍狼','男')");
48         //删除
49         stmt.executeUpdate("DELETE FROM USER_INFO WHERE name='大日如来'");
50         //修改
51         stmt.executeUpdate("UPDATE USER_INFO SET name='孤傲苍狼' WHERE name='苍狼'");
52         //查询
53         ResultSet rs = stmt.executeQuery("SELECT * FROM USER_INFO");
54         //遍历结果集
55         while (rs.next()) {
56             System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("sex"));
57         }
58         //释放资源
59         stmt.close();
60         //关闭连接
61         conn.close();
62     }
63 }

2.3、H2数据库的内存模式

  H2数据库被称为内存数据库,因为它支持在内存中创建数据库和表

  范例如下:

 1 package jdbc.conn.h2.test;2 3 import java.sql.Connection;4 import java.sql.DriverManager;5 import java.sql.ResultSet;6 import java.sql.Statement;7 import java.util.UUID;8 9 /**
10 * @ClassName: TestMemH2
11 * @Description:H2数据库的内存模式(数据只保存在内存中)
12 * @author: 孤傲苍狼
13 * @date: 2014-12-18 下午10:47:01
14 *
15 */
16 public class TestMemH2 {
17
18         //数据库连接URL,通过使用TCP/IP的服务器模式(远程连接),当前连接的是内存里面的gacl数据库
19         private static final String JDBC_URL = "jdbc:h2:tcp://localhost/mem:gacl";
20         //连接数据库时使用的用户名
21         private static final String USER = "gacl";
22         //连接数据库时使用的密码
23         private static final String PASSWORD = "123";
24         //连接H2数据库时使用的驱动类,org.h2.Driver这个类是由H2数据库自己提供的,在H2数据库的jar包中可以找到
25         private static final String DRIVER_CLASS="org.h2.Driver";
26
27         public static void main(String[] args) throws Exception {
28             // 加载H2数据库驱动
29             Class.forName(DRIVER_CLASS);
30             // 根据连接URL,用户名,密码获取数据库连接
31             Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
32             Statement stmt = conn.createStatement();
33             //如果存在USER_INFO表就先删除USER_INFO表
34             stmt.execute("DROP TABLE IF EXISTS USER_INFO");
35             //创建USER_INFO表
36             stmt.execute("CREATE TABLE USER_INFO(id VARCHAR(36) PRIMARY KEY,name VARCHAR(100),sex VARCHAR(4))");
37             //新增
38             stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','大日如来','男')");
39             stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','青龙','男')");
40             stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','白虎','男')");
41             stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','朱雀','女')");
42             stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','玄武','男')");
43             stmt.executeUpdate("INSERT INTO USER_INFO VALUES('" + UUID.randomUUID()+ "','苍狼','男')");
44             //删除
45             stmt.executeUpdate("DELETE FROM USER_INFO WHERE name='大日如来'");
46             //修改
47             stmt.executeUpdate("UPDATE USER_INFO SET name='孤傲苍狼' WHERE name='苍狼'");
48             //查询
49             ResultSet rs = stmt.executeQuery("SELECT * FROM USER_INFO");
50             //遍历结果集
51             while (rs.next()) {
52                 System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("sex"));
53             }
54             //释放资源
55             stmt.close();
56             //关闭连接
57             conn.close();
58         }
59 }

  运行结果如下:

  

  注意:如果使用H2数据库的内存模式,那么我们创建的数据库和表都只是保存在内存中,一旦服务器重启,那么内存中的数据库和表就不存在了。

  以上就是关于在Web应用程序中使用H2数据库的全部内容。

转载于:https://www.cnblogs.com/telwanggs/p/5311907.html

Java嵌入式数据库H2学习总结(二)——在Web应用程序中使用H2数据库相关推荐

  1. 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言

    嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...

  2. Java I/O系统学习系列二:输入和输出

    编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象."流"屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇 ...

  3. Java web程序中备份oracle数据库

    Java web程序中备份oracle数据库 1.生成备份文件: public ActionForward createDmp(ActionMapping mapping, ActionForm fo ...

  4. mye连接mysql数据库_MySQL_如何在Java程序中访问mysql数据库中的数据并进行简单的操作,在上篇文章给大家介绍了Myeclip - phpStudy...

    如何在Java程序中访问mysql数据库中的数据并进行简单的操作 在上篇文章给大家介绍了Myeclipse连接mysql数据库的方法,通过本文给大家介绍如何在Java程序中访问mysql数据库中的数据 ...

  5. 在 Android 应用程序中使用 SQLite 数据库以及怎么用

    part one : android SQLite 简单介绍 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库.它支持 SQL 语言,而且仅仅利用非常少的内存就有非常好的性能.此外它还是开 ...

  6. delphi query 存储为dbf_在Delphi程序中维护DBF数据库

    下载本文示例代码 p> 由于Delphi开发的易用性和快速 性,很多原来使用Foxpro和VisualFoxpro编程的程序员转向了Delphi.但由于工作上或其它的原因,原来的应用系统尤其是应 ...

  7. java面试题8 牛客:在Web应用程序中,( )负责将HTTP请求转换为HttpServletRequest对象

    在Web应用程序中,(    )负责将HTTP请求转换为HttpServletRequest对象 A Servlet对象 B HTTP服务器 C Web容器 D JSP网页 首先我们来看看web程序的 ...

  8. mybatis学习笔记(1)-对原生jdbc程序中的问题总结

    2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(1)-对原生jdbc程序中的问题总结 标签:mybatis [TOC] 本文总结jdbc编程的一般步骤 ...

  9. .NET平台下WEB应用程序的部署(安装数据库和自动配置)

    .NET平台下WEB应用程序的部署(安装数据库和自动配置)   李洪根 在.NET平台下,部署 Web 解决方案是比较方便的.我们可以利用Visual Studio.NET 2003添加一个WEB安装 ...

最新文章

  1. Vue:Elementui中的Tag与页面其它元素相互交互的两三事
  2. sdwan架构怎么搭建?
  3. 程序员面试题精选100题(28)-字符串的排列[算法]
  4. mysql的从节点能否执行事务_MySQL执行事务的语法与流程详解
  5. PHP-CPP开发扩展(五)
  6. linux常见基础服务,常用的linux命令的基本使用(一)
  7. mysql如何实现逻辑自增_每日一面 - mysql 的自增 id 的实现逻辑是什么样子的?
  8. 使用Mysql工具进行数据清洗
  9. 从程序员到项目经理(17):你不是一个人在战斗--思维一换天地宽【转载】
  10. 网博士自助建站系统_自助建站系统软件不一样的建站方式
  11. [Python从零到壹] 十八.可视化分析之Basemap地图包入门详解
  12. OCR怎么能离开扫描仪呢?
  13. 贪心宝贝话说上回讲到海东集团面临内外交困,公司的元老也只剩下XHD夫妇二人了。显然,作为多年拼搏的商人,XHD不会坐以待毙的。 一天,当他正在苦思冥想解困良策的时候,突然想到了自己的传家宝,那是公司成
  14. 服务器布线属于搬迁项目吗,弱电机房服务器搬迁建设整体规划与合理布局
  15. Sequence Model-week1编程题2(Character level language model-Dinosaurus land)
  16. 测试用例设计—场景分析法
  17. python tkinter画福字
  18. Qt嵌入式开发的初步认识
  19. 微信Android客户端的ANR监控方案
  20. MySql 中 PK、NN、UQ、BIN、UN、ZF、AI、G分别代表什么意思

热门文章

  1. mysql binlog生成异常_mysql binlog故障演练
  2. 恐龙机器人钢索恐龙形态_恐龙一直是以僵尸形态出现的,它们的真面貌可能把人萌翻...
  3. winsocket(1)
  4. 1.c++模式设计-简单工厂模式
  5. 【CCS】CCS全局搜索
  6. html 圆圈项目符号,html – 列表项下的项目符号
  7. 16位和32位微处理器(4)——Pentium的寄存器及相关机制
  8. PPP协议体系的实现
  9. linux server 5.5下载地址,《红帽Linux 5.5 for x86 服务器版》(RedHat Enterprise Linux Server 5.5 for x86)...
  10. mysql中merge的用法_mysql中merge表存儲引擎用法介紹