本例介绍H2与web项目的集成

项目启动H2数据库

  1、新建Maven Web项目,参考:【Maven】Eclipse 使用Maven创建Java Web项目

  2、引入h2的jar包依赖

 <dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>

  3、编辑web.xml文件,注册h2内置的监听器,监听ServletContext 对象启动,而启动H2数据库

 <!-- 监听启动H2 DB -->
<listener>
<listener-class>org.h2.server.web.DbStarter</listener-class>
</listener> <!-- H2 DB 参数 -->
<context-param>
<param-name>db.url</param-name>
<param-value>jdbc:h2:/D:/data/sample</param-value>
</context-param>
<context-param>
<param-name>db.user</param-name>
<param-value>sa</param-value>
</context-param>
<context-param>
<param-name>db.password</param-name>
<param-value></param-value>
</context-param>
<!-- 运行其他服务器访问 -->
<context-param>
<param-name>db.tcpServer</param-name>
<param-value>-tcpAllowOthers</param-value>
</context-param>

    org.h2.server.web.DbStarter监听器代码如下,可以看到监听器创建的H2数据库,并且将一个数据库连接放入ServletContext 对象中。

 /*
* Copyright 2004-2019 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.server.web; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement; import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; import org.h2.tools.Server;
import org.h2.util.StringUtils; /**
* This class can be used to start the H2 TCP server (or other H2 servers, for
* example the PG server) inside a web application container such as Tomcat or
* Jetty. It can also open a database connection.
*/
public class DbStarter implements ServletContextListener { private Connection conn;
private Server server; @Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
try {
org.h2.Driver.load(); // This will get the setting from a context-param in web.xml if
// defined:
ServletContext servletContext = servletContextEvent.getServletContext();
String url = getParameter(servletContext, "db.url", "jdbc:h2:~/test");
String user = getParameter(servletContext, "db.user", "sa");
String password = getParameter(servletContext, "db.password", "sa"); // Start the server if configured to do so
String serverParams = getParameter(servletContext, "db.tcpServer", null);
if (serverParams != null) {
String[] params = StringUtils.arraySplit(serverParams, ' ', true);
server = Server.createTcpServer(params);
server.start();
} // To access the database in server mode, use the database URL:
// jdbc:h2:tcp://localhost/~/test
conn = DriverManager.getConnection(url, user, password);
servletContext.setAttribute("connection", conn);
} catch (Exception e) {
e.printStackTrace();
}
} private static String getParameter(ServletContext servletContext,
String key, String defaultValue) {
String value = servletContext.getInitParameter(key);
return value == null ? defaultValue : value;
} /**
* Get the connection.
*
* @return the connection
*/
public Connection getConnection() {
return conn;
} @Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
try {
Statement stat = conn.createStatement();
stat.execute("SHUTDOWN");
stat.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
if (server != null) {
server.stop();
server = null;
}
} }

  4、编辑测试Servlet,SampleServlet.java类

 package com.test.h2.servlet;

 import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class SampleServlet extends HttpServlet { /**
*
*/
private static final long serialVersionUID = 1L; @Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 从ServletContext获取 连接对象
Connection con = (Connection) getServletContext().getAttribute("connection"); try {
// 新建数据表
String ctreateTable = "DROP TABLE test IF EXISTS; create table test(id integer,name VARCHAR(22) )";
Statement createStatement = con.createStatement();
long f1 = createStatement.executeUpdate(ctreateTable);
System.out.println("创建表:" + f1); // 插入数据
String insertSql = "INSERT INTO test VALUES(1,'小明')";
Statement insertStatement = con.createStatement();
long f2 = insertStatement.executeUpdate(insertSql);
System.out.println("插入数据:" + f2); // 查询数据
String selectSql = "select id,name from test";
PreparedStatement prepareStatement = con.prepareStatement(selectSql);
// 发送SQL 返回一个ResultSet
ResultSet rs = prepareStatement.executeQuery(); // 编历结果集
while (rs.next())// 从数据库的取一行数据,是否还有下一行
{
int id = rs.getInt(1); // 从1开始
String name = rs.getString(2);
System.out.println("id:" + id + "\t名称:" + name);
}
resp.getWriter().print("SUCCESS");
} catch (Exception e) {
resp.getWriter().print("FAILE");
} } }

  5、在web.xml中,注册SampleServlet

 <servlet>
<servlet-name>SampleServlet</servlet-name>
<servlet-class>com.test.h2.servlet.SampleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SampleServlet</servlet-name>
<url-pattern>/sample</url-pattern>
</servlet-mapping>

  6、将项目发布到tomcat中,并启动,在浏览器中输入地址:http://localhost:8080/test-h2/sample,进行访问

    

使用H2控制台Servlet

  7、在项目中集成H2控制台,在web.xml文件中注册h2 jar包中内置的Servlet

 <!-- 使用H2控制台Servlet -->
<servlet>
<servlet-name>H2Console</servlet-name>
<servlet-class>org.h2.server.web.WebServlet</servlet-class>
<!--
<init-param>
<param-name>webAllowOthers</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>trace</param-name>
<param-value></param-value>
</init-param>
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>H2Console</servlet-name>
<url-pattern>/console/*</url-pattern>
</servlet-mapping>
<!--
<security-role>
<role-name>admin</role-name>
</security-role>
<security-constraint>
<web-resource-collection>
<web-resource-name>H2 Console</web-resource-name>
<url-pattern>/console/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
-->

  8、重启服务,在浏览器中输入地址:http://localhost:8080/test-h2/console进行访问

    

向H2数据库注册自定义的数据库函数

  9、编辑自定义函数类H2DBFunctionExt.java

 package com.test.h2.function;

 import java.util.UUID;

 /**
* 对H2数据库函数的扩展
* @author hd
* @date 2019-05-28 18:46:07
*
*/
public class H2DBFunctionExt { /**
* 用法:SELECT myid();
* @return
*/
public static String myid(){
return UUID.randomUUID().toString().replaceAll("-", "");
} }

  10、编辑数据库注册监听类RegisterH2ExtFuncListener.java

 package com.test.h2.listener;

 import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement; import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class RegisterH2ExtFuncListener implements ServletContextListener { @Override
public void contextInitialized(ServletContextEvent servletContextEvent) { ServletContext servletContext = servletContextEvent.getServletContext(); // 1、注册myid函数的SQL语句,语句格式:CREATE ALIAS [IF NOT EXISTS] newFunctionAliasName [DETERMINISTIC] FOR classAndMethodName
String sql = "CREATE ALIAS IF NOT EXISTS myid FOR \"com.test.h2.function.H2DBFunctionExt.myid\""; // 2、从ServletContext获取 连接对象
Connection con = (Connection) servletContext.getAttribute("connection");
try { // 3、获取Statement对象
Statement stmt = con.createStatement(); // 4、执行sql
stmt.execute(sql); System.out.println("H2数据库扩展函数注册成功!"); } catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("H2数据库扩展函数注册失败!");
e.printStackTrace();
}
} @Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
// TODO Auto-generated method stub
ServletContextListener.super.contextDestroyed(servletContextEvent);
} }

  11、注册监听器,注意放在H2启动监听器之后

 <!-- 注册RegisterH2ExtFuncListener监听器 -->
<listener>
<listener-class>com.test.h2.listener.RegisterH2ExtFuncListener</listener-class>
</listener>

  12、重启项目,登录H2控制台,使用sql:SELECT myid(); 查询

    

  与Spring集成参考:【DataBase】Hsqldb与项目集成

【DataBase】H2 DateBase与项目集成的更多相关文章

  1. 【DataBase】Hsqldb与项目集成

    Hsqldb与项目集成 进行模式下集成 可以集成进行(In-Process)模式下的hsqldb,由于数据存储在文件中,即使程序退出,数据也不会被销毁 采用jdbc集成的方式 package com. ...

  2. 【DataBase】H2 DateBase的拓展使用

    连接模式 支持以下连接模式: 嵌入模式(使用JDBC的本地连接) 服务器模式(使用JDBC或ODBC over TCP / IP进行远程连接) 混合模式(同时本地和远程连接) 嵌入模式 在嵌入模式下, ...

  3. If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.

    学习Spring Boot 过程中遇到了下列这个问题 Description: Failed to configure a DataSource: 'url' attribute is not spe ...

  4. embedded database (H2, HSQL or Derby), please put it on the classpath

    Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded data ...

  5. SkyWalking APM8.1.0 搭建与项目集成使用

    SkyWalking介绍 SkyWalking是什么? SkyWalking是一个可观测性分析平台和应用性能管理系统,提供分布式跟踪.服务网格遥测分析.度量聚合和可视化一体化解决方案,并支持多种开发语 ...

  6. Taurus.MVC 微服务框架 入门开发教程:项目集成:5、统一的日志管理。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  7. 现有iOS项目集成React Native过程记录

    在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...

  8. Vuejs实例-02Vue.js项目集成ElementUI

    Vuejs实例-02Vue.js项目集成ElementUI 0:前言 vue.js的UI组件库,在git上有多个项目,我见的使用者比较多的是iView和Element.两个组件库,组件都很丰富. 官网 ...

  9. 项目集成自动分词系统ansj,实现自定义词库

    一,分词系统地址:https://github.com/NLPchina/ansj_seg 二,为什么选择ansj? 1.项目需求: 我们平台要做手机售后的舆情分析,即对购买手机的用户的评论进行分析. ...

随机推荐

  1. Two Year's Harvest

    转眼间来到这里已经两年,在懵懵懂懂中渐渐在成长,一步一步走过脚下的路.这两年你说长,时间也是不短,但说长吧,时间又匆匆在指间匆匆流走.还记得大一时老师为我们讲专业课,那时候还不知道TGB,只是在五月的 ...

  2. [唐胡璐]Selenium技巧 - 利用MonteScreenRecorder录制视频

    我们可以用以下方式在Selenium Webdriver中capture video. 基本步骤: 从 http://www.randelshofer.ch/monte/,下载“MonteScreen ...

  3. zmq使用记录

    zmq套接字介绍 https://www.cnblogs.com/fengbohello/p/4354989.html zmq示例 https://github.com/booksbyus/zguid ...

  4. Greenplum failed segment的恢复方法--primary与mirror都可修复

    当在使用greenplum过程中有不当的操作时,可能会出现segment节点宕掉的情况(比如在greenplum运行的过程中停掉其中几台segment节点的服务器),通过下面的方法可以恢复segmen ...

  5. java文件夹上传下载组件

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  6. PHP-FPM 的工作整理

    1.php-fpm的配置文件 根据命令找到路径修改配置文件 ps -ef|grep php-fpm vim /home/php/etc/php-fpm.conf ;;;;;;;;;;;;;;;;;; ...

  7. 巧用DNSlog实现无回显注入【转载】

    原作者:afanti 原出处:https://www.cnblogs.com/afanti/p/8047530.html 0x00 简介 测试一些网站的时候,一些注入都是无回显的,我们可以写脚本来进行 ...

  8. Xtrabackup--备份mysql

    Xtrabackup介绍 Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁): ...

  9. SyntaxError: Non-ASCII character 'æ' in file csdn.py on line 7, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

    错误信息: SyntaxError: Non-ASCII character , but no encoding declared; see http://python.org/dev/peps/pe ...

  10. Tensorflow object detection API(1)---环境搭建与测试

    参考: https://blog.csdn.net/dy_guox/article/details/79081499 https://blog.csdn.net/u010103202/article/ ...