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

项目启动H2数据库

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

  2、引入h2的jar包依赖

  1. <dependency>
  2. <groupId>com.h2database</groupId>
  3. <artifactId>h2</artifactId>
  4. <version>1.4.199</version>
  5. </dependency>

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

  1. <!-- 监听启动H2 DB -->
  2. <listener>
  3. <listener-class>org.h2.server.web.DbStarter</listener-class>
  4. </listener>
  5.  
  6. <!-- H2 DB 参数 -->
  7. <context-param>
  8. <param-name>db.url</param-name>
  9. <param-value>jdbc:h2:/D:/data/sample</param-value>
  10. </context-param>
  11. <context-param>
  12. <param-name>db.user</param-name>
  13. <param-value>sa</param-value>
  14. </context-param>
  15. <context-param>
  16. <param-name>db.password</param-name>
  17. <param-value></param-value>
  18. </context-param>
  19. <!-- 运行其他服务器访问 -->
  20. <context-param>
  21. <param-name>db.tcpServer</param-name>
  22. <param-value>-tcpAllowOthers</param-value>
  23. </context-param>

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

  1. /*
  2. * Copyright 2004-2019 H2 Group. Multiple-Licensed under the MPL 2.0,
  3. * and the EPL 1.0 (http://h2database.com/html/license.html).
  4. * Initial Developer: H2 Group
  5. */
  6. package org.h2.server.web;
  7.  
  8. import java.sql.Connection;
  9. import java.sql.DriverManager;
  10. import java.sql.Statement;
  11.  
  12. import javax.servlet.ServletContext;
  13. import javax.servlet.ServletContextEvent;
  14. import javax.servlet.ServletContextListener;
  15.  
  16. import org.h2.tools.Server;
  17. import org.h2.util.StringUtils;
  18.  
  19. /**
  20. * This class can be used to start the H2 TCP server (or other H2 servers, for
  21. * example the PG server) inside a web application container such as Tomcat or
  22. * Jetty. It can also open a database connection.
  23. */
  24. public class DbStarter implements ServletContextListener {
  25.  
  26. private Connection conn;
  27. private Server server;
  28.  
  29. @Override
  30. public void contextInitialized(ServletContextEvent servletContextEvent) {
  31. try {
  32. org.h2.Driver.load();
  33.  
  34. // This will get the setting from a context-param in web.xml if
  35. // defined:
  36. ServletContext servletContext = servletContextEvent.getServletContext();
  37. String url = getParameter(servletContext, "db.url", "jdbc:h2:~/test");
  38. String user = getParameter(servletContext, "db.user", "sa");
  39. String password = getParameter(servletContext, "db.password", "sa");
  40.  
  41. // Start the server if configured to do so
  42. String serverParams = getParameter(servletContext, "db.tcpServer", null);
  43. if (serverParams != null) {
  44. String[] params = StringUtils.arraySplit(serverParams, ' ', true);
  45. server = Server.createTcpServer(params);
  46. server.start();
  47. }
  48.  
  49. // To access the database in server mode, use the database URL:
  50. // jdbc:h2:tcp://localhost/~/test
  51. conn = DriverManager.getConnection(url, user, password);
  52. servletContext.setAttribute("connection", conn);
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. }
  56. }
  57.  
  58. private static String getParameter(ServletContext servletContext,
  59. String key, String defaultValue) {
  60. String value = servletContext.getInitParameter(key);
  61. return value == null ? defaultValue : value;
  62. }
  63.  
  64. /**
  65. * Get the connection.
  66. *
  67. * @return the connection
  68. */
  69. public Connection getConnection() {
  70. return conn;
  71. }
  72.  
  73. @Override
  74. public void contextDestroyed(ServletContextEvent servletContextEvent) {
  75. try {
  76. Statement stat = conn.createStatement();
  77. stat.execute("SHUTDOWN");
  78. stat.close();
  79. } catch (Exception e) {
  80. e.printStackTrace();
  81. }
  82. try {
  83. conn.close();
  84. } catch (Exception e) {
  85. e.printStackTrace();
  86. }
  87. if (server != null) {
  88. server.stop();
  89. server = null;
  90. }
  91. }
  92.  
  93. }

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

  1. package com.test.h2.servlet;
  2.  
  3. import java.io.IOException;
  4. import java.sql.Connection;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.Statement;
  8.  
  9. import javax.servlet.ServletException;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13.  
  14. public class SampleServlet extends HttpServlet {
  15.  
  16. /**
  17. *
  18. */
  19. private static final long serialVersionUID = 1L;
  20.  
  21. @Override
  22. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  23. // 从ServletContext获取 连接对象
  24. Connection con = (Connection) getServletContext().getAttribute("connection");
  25.  
  26. try {
  27. // 新建数据表
  28. String ctreateTable = "DROP TABLE test IF EXISTS; create table test(id integer,name VARCHAR(22) )";
  29. Statement createStatement = con.createStatement();
  30. long f1 = createStatement.executeUpdate(ctreateTable);
  31. System.out.println("创建表:" + f1);
  32.  
  33. // 插入数据
  34. String insertSql = "INSERT INTO test VALUES(1,'小明')";
  35. Statement insertStatement = con.createStatement();
  36. long f2 = insertStatement.executeUpdate(insertSql);
  37. System.out.println("插入数据:" + f2);
  38.  
  39. // 查询数据
  40. String selectSql = "select id,name from test";
  41. PreparedStatement prepareStatement = con.prepareStatement(selectSql);
  42. // 发送SQL 返回一个ResultSet
  43. ResultSet rs = prepareStatement.executeQuery();
  44.  
  45. // 编历结果集
  46. while (rs.next())// 从数据库的取一行数据,是否还有下一行
  47. {
  48. int id = rs.getInt(1); // 从1开始
  49. String name = rs.getString(2);
  50. System.out.println("id:" + id + "\t名称:" + name);
  51. }
  52. resp.getWriter().print("SUCCESS");
  53. } catch (Exception e) {
  54. resp.getWriter().print("FAILE");
  55. }
  56.  
  57. }
  58.  
  59. }

  5、在web.xml中,注册SampleServlet

  1. <servlet>
  2. <servlet-name>SampleServlet</servlet-name>
  3. <servlet-class>com.test.h2.servlet.SampleServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>SampleServlet</servlet-name>
  7. <url-pattern>/sample</url-pattern>
  8. </servlet-mapping>

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

    

使用H2控制台Servlet

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

  1. <!-- 使用H2控制台Servlet -->
  2. <servlet>
  3. <servlet-name>H2Console</servlet-name>
  4. <servlet-class>org.h2.server.web.WebServlet</servlet-class>
  5. <!--
  6. <init-param>
  7. <param-name>webAllowOthers</param-name>
  8. <param-value></param-value>
  9. </init-param>
  10. <init-param>
  11. <param-name>trace</param-name>
  12. <param-value></param-value>
  13. </init-param>
  14. -->
  15. <load-on-startup>1</load-on-startup>
  16. </servlet>
  17. <servlet-mapping>
  18. <servlet-name>H2Console</servlet-name>
  19. <url-pattern>/console/*</url-pattern>
  20. </servlet-mapping>
  21. <!--
  22. <security-role>
  23. <role-name>admin</role-name>
  24. </security-role>
  25. <security-constraint>
  26. <web-resource-collection>
  27. <web-resource-name>H2 Console</web-resource-name>
  28. <url-pattern>/console/*</url-pattern>
  29. </web-resource-collection>
  30. <auth-constraint>
  31. <role-name>admin</role-name>
  32. </auth-constraint>
  33. </security-constraint>
  34. -->

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

    

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

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

  1. package com.test.h2.function;
  2.  
  3. import java.util.UUID;
  4.  
  5. /**
  6. * 对H2数据库函数的扩展
  7. * @author hd
  8. * @date 2019-05-28 18:46:07
  9. *
  10. */
  11. public class H2DBFunctionExt {
  12.  
  13. /**
  14. * 用法:SELECT myid();
  15. * @return
  16. */
  17. public static String myid(){
  18. return UUID.randomUUID().toString().replaceAll("-", "");
  19. }
  20.  
  21. }

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

  1. package com.test.h2.listener;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6.  
  7. import javax.servlet.ServletContext;
  8. import javax.servlet.ServletContextEvent;
  9. import javax.servlet.ServletContextListener;
  10.  
  11. public class RegisterH2ExtFuncListener implements ServletContextListener {
  12.  
  13. @Override
  14. public void contextInitialized(ServletContextEvent servletContextEvent) {
  15.  
  16. ServletContext servletContext = servletContextEvent.getServletContext();
  17.  
  18. // 1、注册myid函数的SQL语句,语句格式:CREATE ALIAS [IF NOT EXISTS] newFunctionAliasName [DETERMINISTIC] FOR classAndMethodName
  19. String sql = "CREATE ALIAS IF NOT EXISTS myid FOR \"com.test.h2.function.H2DBFunctionExt.myid\"";
  20.  
  21. // 2、从ServletContext获取 连接对象
  22. Connection con = (Connection) servletContext.getAttribute("connection");
  23. try {
  24.  
  25. // 3、获取Statement对象
  26. Statement stmt = con.createStatement();
  27.  
  28. // 4、执行sql
  29. stmt.execute(sql);
  30.  
  31. System.out.println("H2数据库扩展函数注册成功!");
  32.  
  33. } catch (SQLException e) {
  34. // TODO Auto-generated catch block
  35. System.out.println("H2数据库扩展函数注册失败!");
  36. e.printStackTrace();
  37. }
  38. }
  39.  
  40. @Override
  41. public void contextDestroyed(ServletContextEvent servletContextEvent) {
  42. // TODO Auto-generated method stub
  43. ServletContextListener.super.contextDestroyed(servletContextEvent);
  44. }
  45.  
  46. }

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

  1. <!-- 注册RegisterH2ExtFuncListener监听器 -->
  2. <listener>
  3. <listener-class>com.test.h2.listener.RegisterH2ExtFuncListener</listener-class>
  4. </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. 结构型模式(五) 外观模式(Facade)

    一.动机(Motivate) 在软件系统开发的过程中,当组件的客户(即外部接口,或客户程序)和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战. ...

  2. MySQL 索引原理及慢查询优化

    MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位 ...

  3. java spring boot 导出/下载文本文件操作(包含写文本文件)

    内容简介 本文主要内容为使用java把内容写入文本文件,并实现下载/导出的功能. 实现步骤 1. controller层 @ResponseBody @RequestMapping(value = & ...

  4. 2019/7/22----tomacat配置web页面访问路径

    tomcat----conf-----Catalina----localhost----cms.xml,cms.xml文件中添加: <?xml version='1.0' encoding=&q ...

  5. learning java AWT widowEvent and MouseEvent

    import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import jav ...

  6. 鼠标经过图片会移动(css3过渡,overflow:hidden)

    效果图如下: 代码: <body> <div><img src="jd.jpg"></div> </body> img{ ...

  7. ipkg-nas

    http://pkg.entware.net/binaries/x86-64/ https://forum.synology.com/enu/viewtopic.php?t=95346 http:// ...

  8. git的实际工作经验总结

    分支工作的一个较佳的实践, 即git工作的最佳实践 从最初的svn到后来的git,上来给我的感觉就是git更方便, 可以在本地进行版本的提交,回退. 后来对hash有所了解, 知道了git的每个版本其 ...

  9. 《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

        新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...

  10. Java 按字节计算字符串的长度

       在<从后向前截取指定长度的字符串>中介绍了如何截取字符串,本文介绍如何统计字符串的字节长度. import org.slf4j.Logger; import org.slf4j.Lo ...