【DataBase】H2 DateBase与项目集成
本例介绍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与项目集成的更多相关文章
- 【DataBase】Hsqldb与项目集成
Hsqldb与项目集成 进行模式下集成 可以集成进行(In-Process)模式下的hsqldb,由于数据存储在文件中,即使程序退出,数据也不会被销毁 采用jdbc集成的方式 package com. ...
- 【DataBase】H2 DateBase的拓展使用
连接模式 支持以下连接模式: 嵌入模式(使用JDBC的本地连接) 服务器模式(使用JDBC或ODBC over TCP / IP进行远程连接) 混合模式(同时本地和远程连接) 嵌入模式 在嵌入模式下, ...
- 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 ...
- 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 ...
- SkyWalking APM8.1.0 搭建与项目集成使用
SkyWalking介绍 SkyWalking是什么? SkyWalking是一个可观测性分析平台和应用性能管理系统,提供分布式跟踪.服务网格遥测分析.度量聚合和可视化一体化解决方案,并支持多种开发语 ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:5、统一的日志管理。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- 现有iOS项目集成React Native过程记录
在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...
- Vuejs实例-02Vue.js项目集成ElementUI
Vuejs实例-02Vue.js项目集成ElementUI 0:前言 vue.js的UI组件库,在git上有多个项目,我见的使用者比较多的是iView和Element.两个组件库,组件都很丰富. 官网 ...
- 项目集成自动分词系统ansj,实现自定义词库
一,分词系统地址:https://github.com/NLPchina/ansj_seg 二,为什么选择ansj? 1.项目需求: 我们平台要做手机售后的舆情分析,即对购买手机的用户的评论进行分析. ...
随机推荐
- 行为型模式(六) 状态模式(State)
一.动机(Motivate) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同. 如何在运行时根据对象的状态 ...
- Eclipse中修改了项目,导入Tomcat中时,括号显示原来项目的名字
Eclipse中Tomcat导入项目并且修改了项目名字,把项目添加到Tomcat上,发现在项目后面带了个括号里面显示原来项目的名字,并且在访问的时候也只能用原来的项目名访问,怎么办呢? 1.打开你的项 ...
- Backpack III
Description Given n kinds of items, and each kind of item has an infinite number available. The i-th ...
- JavaScript基础——数组
一 .数组的介绍 1.概念:数据的集合,任何数据都可以放在数组中 2.作用:可以同时操作多个数据 3.数组的创建: 字面量:var arr = [ ]; 构造函数:var arr = new Arra ...
- 洛谷 P4408 [NOI2003] 逃学的小孩 题解
Analysis 题意虽然说先去谁家再去谁家,但是我们不需要管这个,因为AA.BB.CC三个点我们可以任意互相交换它们所代表的对象,所以题目要求的就是在一棵树上找到3个点AA.BB.CC令AB+BCA ...
- YAML_12 批量创建用户,分别设置用户组
with_items标准循环 ansible]# vim add.yml --- - hosts: web2 remote_user: root tasks: - user: ...
- luogu 2312 解方程 乱搞+取模
思路非常好想,但是你很难想到去用这个算法,因为这个几乎就是个乱搞~ 我们发现多项式中每一个系数都很大,但是 $m$ 却很小,即最多只用 $10^6$ 个整数需要验证. 我们知道,如果一个数等于 $0$ ...
- BCB key事件中判断Shift、Alt、Ctrl状态
BCB key事件中判断Shift.Alt.Ctrl状态: 类似此事件中 void __fastcall TForm1::keydown(TObject *Sender, WORD &Key, ...
- 10分钟用Python爬取最近很火的复联4影评
欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! <复仇者联盟4:终局之战>已经上映快三个星期了,全球票房破24亿美元,国内票房破40亿人民币. 虽然现在热度逐渐下降,但是我们还 ...
- 2019年领航杯 江苏省网络信息安全竞赛 初赛部分writeup
赛题已上传,下载连接:https://github.com/raddyfiy/2019linghangcup 做出了全部的misc和前三道逆向题,排名第10,暂且贴一下writeup. 关卡一 编码解 ...