本例介绍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. destoon6.0搜索页熊掌号页面改造技巧【原创】

    大家都知道,DT官方是封禁搜索页的,是不让百度蜘蛛抓取的,但是搜索页又是大型网站优化的重点,今天来说说关于DT6.0搜索页熊掌号的改造方法,如果您要改造内容页面可以查看我前几期的分享! 首先要开启百度 ...

  2. Oracle 数据库中的GROUP BY与HAVING

    一.GROUP BY GROUP BY语句用来与聚合函数(aggregate functions such as COUNT, SUM, AVG, MIN, or MAX.)联合使用来得到一个或多个列 ...

  3. 创建型模式(四) 建造者\生成器模式(Builder)

    一.动机(Motivation) 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们 ...

  4. WSGI原理

    web_server: import socket import time import multiprocessing import re import mini_frame class WSGIS ...

  5. 移动端videojs视频插件使用直播流rtmp、hls、http-flv的注意事项

    可以访问:https://videojs.com/ 下载对应的脚本包 特别注意的是 移动端videojs一般应用的直播流协议为HLS, RTMP协议一般是PC上使用,需要flash支持. HLS直播源 ...

  6. if语句:求x的绝对值

    #include<stdio.h>void main(){ int x,y; scanf("%d", &x); printf("x=%d\n" ...

  7. Linux 命令 ipcs/ipcrm

    ipcs 1. 命令格式 ipcs [resource-option] [output-format] ipcs [resource-option] -i id 2. 命令功能 提供IPC设备的信息 ...

  8. learning java AWT 右键菜单

    import java.awt.*; import java.awt.event.*; public class SimpleMenu { private Frame f = new Frame(&q ...

  9. c++和cuda混合编程 实现传统神经网络

    直接放代码了... 实现的是x1+x2=y的预测,但梯度下降很慢...233333,gpu运行时间很快!! // // main.cpp // bp // // Created by jzc on 2 ...

  10. DIJ的优化,和spfa的优化

    SPFA和DIJ求最短路的算法的坑点一直是很多的.经常会让人搞不懂. 易错案例: 用重载运算符来排序,如: struct cmp { bool operator ()(int x, int y) co ...