H2内嵌数据库的使用

H2是一个开源的嵌入式数据库引擎,采用java语言编写,不受平台的限制。

同时H2提供了一个十分方便的web控制台用于操作和管理数据库内容。

H2还提供兼容模式,可以兼容一些主流的数据库,因此采用H2作为开发期的数据库非常方便。

H2作为一个嵌入型的数据库,它最大的好处就是可以嵌入到我们的Web应用中,和我们的Web应用绑定在一起,成为我们Web应用的一部分。

运行方式

H2数据库有三种运行方式实现:

  1. 嵌入式(embedded):可以同应用程序打包在一起发布,这样可以非常方便地存储少量结构化数据

  2. 服务模式:

    1. TCP/IP server:支持客户端/服务器端的连接方式

    2. web server:此种运行方式支持使用浏览器访问H2 Console

    3. PG server:支持PostgreSQL客户端

  3. 内存方式:可以作为缓存,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以拿它当Memcached使,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表。

JDBC URL

1、内嵌模式不用启动服务,已内嵌,不用显示启动服务

String jdbcURL = "jdbc:h2:~/h2/db";

2、TCP/IP server 服务器模式,必须要显示启动服务

String jdbcURL = "jdbc:h2:tcp://localhost/~/h2/db";

3、内存模式

String jdbcURL = "jdbc:h2:mem:h2db";

// 或者

String jdbcURL = "jdbc:h2:tcp://localhost/mem:h2db";

Java应用中的使用

操作实例

H2数据库基本操作:

// ~ 用户目录C:\Users\用户名\
String jdbcURL = "不同模式下,不同的jdbcURL,其他操作一样";

//连接数据库时使用的用户名
final String user = "tianya";

//连接数据库时使用的密码
String password = "123456";

//连接H2数据库时使用的驱动类
//org.h2.Driver
String driverClass="org.h2.Driver";

try { // 1、加载驱动
Class.forName(driverClass); // 2、获取连接
Connection connection = DriverManager.getConnection(jdbcURL, user, password);
Statement statement = connection.createStatement(); // 3、执行操作
// 3.1、先删除表,若存在
statement.execute("drop table user_info if exists "); // 3.2、创建表
statement.execute("create table user_info(id int primary key, name varchar(10), age int , sex varchar(2) )"); // 4、新增
statement.executeUpdate("insert into user_info(id,name,age,sex) values(1,'张三',23,'男' )");
statement.executeUpdate("insert into user_info(id,name,age,sex) values(2,'李四',25,'男' )");
statement.executeUpdate("insert into user_info(id,name,age,sex) values(3,'王五',33,'男' )");
statement.executeUpdate("insert into user_info(id,name,age,sex) values(4,'珠帘',23,'女' )");
statement.executeUpdate("insert into user_info(id,name,age,sex) values(5,'鲤鱼',20,'女' )"); // 5、查询
ResultSet rs = statement.executeQuery("select * from user_info");
while (rs.next()) {
System.out.println(rs.getInt(1) + " - " + rs.getString(2)
+ " - " + rs.getInt(3)+ " - " + rs.getString(4) );
} // 释放资源
statement.close();
connection.close(); } catch (Exception e) {
e.printStackTrace();
}

Java web 应用中的使用

H2服务的启动

1.命令行启动服务

java -cp h2*.jar org.h2.tools.Server -?

常见的选项如下:

-web:启动支持H2 Console的服务
-webPort <port>:服务启动端口,默认为8082
-browser:启动H2 Console web管理页面
-tcp:使用TCP server模式启动
-pg:使用PG server模式启动

如:

## 浏览器web服务方式
java -jar h2*.jar org.h2.tools.Server -web -webPort  -browser 

## TCP服务方式
java -jar h2*.jar org.h2.tools.Server -tcp -tcpPort  -tcpSSL 
 

2.Servlet的方式

注解的方式

package com.tianya.mw.web;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRegistration.Dynamic;
import javax.servlet.annotation.WebListener;

import org.apache.log4j.Logger;
import org.h2.server.web.WebServlet;
import org.h2.tools.Server;

/**
* Copyright: Copyright (c) 2019 tianwyam
*
* @ClassName: H2DBServerListener.java
* @Description: 在WEB应用中启动H2数据库服务的监听器
* @version: v1.0.0
* @author: tianwyam
* @date: 2019年3月18日 上午9:56:21
*/
@WebListener
public class H2DBServerListener implements ServletContextListener {

private transient static final Logger log = Logger.getLogger(H2DBServerListener.class);
// H2 DB 服务
private Server server; // H2 tcp访问的端口
public static final int H2_DB_SERVER_PORT = 8082 ;

@Override
public void contextInitialized(ServletContextEvent event) { try { // 启动H2数据库服务
log.info("启动H2数据库...");
log.info(String.format("TCP客户端访问端口:%s", H2_DB_SERVER_PORT));
// 默认端口为8082
server = Server.createTcpServer(
"-tcpPort",
String.valueOf(H2_DB_SERVER_PORT),
"-tcpAllowOthers").start();
log.info("H2数据库启动成功..."); ​
// 注解方式 添加 H2 DB console 访问 WebServlet
// 注册 H2数据库 web 控制台
// 添加 org.h2.server.web.WebServlet
ServletContext servletContext = event.getServletContext();
Dynamic webServlet = servletContext.addServlet("H2Console", WebServlet.class);
// 控制台 访问路径
webServlet.addMapping("/console/*");
webServlet.setLoadOnStartup(1);
// 设置配置
Map<String, String> initParameters = new HashMap<>();
initParameters.put("allowOthers", "true");
initParameters.put("trace", "true");
webServlet.setInitParameters(initParameters); log.info("H2 CONSOLE 默认访问URL:http://localhost:8080/[project_name]/console/"); } catch (SQLException e) {
log.error("H2数据库启动失败!", e);
}

}

@Override
public void contextDestroyed(ServletContextEvent event) {

// 停止服务
if (server != null) {
log.info("关闭H2数据库...");
server.shutdown();
log.info("关闭H2数据库成功...");
}
}

}

web.xml配置方式

<!-- 注册服务监听 -->
<listener>
<listener-class>com.tianya.mw.web.H2DBServerListener</listener-class>
</listener>

<!-- 使用H2控制台的Servlet H2控制台是一个独立的应用程序,
包括它自己的Web服务器,但它可以作为一个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>

<!-- 映射H2控制台的访问路径 -->
<servlet-mapping>
<servlet-name>H2Console</servlet-name>
<url-pattern>/console/*</url-pattern>
</servlet-mapping>

访问 查看是否服务启动成功

http://localhost:8080/[project_name]/console/

3.maven插件方式

<build>

<finalName>LearnH2DB</finalName> <!-- maven插件方式启动 H2 DB 服务 -->
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>org.h2.tools.Server</mainClass>
<arguments>
<argument>-web</argument>
<argument>-webPort</argument>
<argument>8082</argument>
<argument>-browser</argument>
</arguments>
</configuration>
</plugin>
</plugins> </build>

执行命令

mvn exec:java

相当于

java -jar h2*.jar org.h2.tools.Server -web -webPort 8082 -browser

数据库初始化

1.maven方式

<!-- 初始化 配置  -->
<profiles>
<profile>
<id>init-db</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<property file="src/main/resources/h2_jdbc.properties" />
<sql driver="${jdbc.driver}"
url="${jdbc.url}"
userid="${jdbc.username}"
password="${jdbc.password}"
onerror="continue"
encoding="${project.build.sourceEncoding}">
<classpath refid="maven.test.classpath" />
<transaction src="src/main/resources/sql/h2/schema.sql" />
<transaction src="src/main/resources/sql/h2/data.sql" />
</sql>
</target>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>

执行命令:

mvn antrun:run -P init-db

2.spring方式

<beans profile="test">
<context:property-placeholder ignore-resource-not-found="true"
location="classpath*:/*_jdbc.properties" /> <!-- Spring Simple连接池 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>

<!-- 初始化数据表结构 -->
<jdbc:initialize-database data-source="dataSource" ignore-failures="ALL">
<jdbc:script location="classpath:sql/h2/schema.sql" />
<jdbc:script location="classpath:sql/h2/data.sql" encoding="UTF-8"/>
</jdbc:initialize-database>
</beans>

H2内嵌数据库的使用的更多相关文章

  1. H2内嵌数据库使用步骤

    1.找到h2数据库的jar包 D:\repositories\com\h2database\h2\1.4.187\h2-1.4.187.jar 2.双击jar包,配置连接信息 Driver Class ...

  2. SpringBoot使用H2内嵌数据库

    1.驱动 我们知道,JDBC是JDK自带的接口规范,不同的数据库有不同的实现,只需要引入相应的驱动包即可. 在使用MySQL数据库时,引入的是MySQL驱动,相应的,使用H2数据库时,也需要引入H2驱 ...

  3. h2内嵌数据库使用

    参考文档 1 https://www.cnblogs.com/xdp-gacl/p/4171024.html 参考文档 2 https://blog.csdn.net/mafan121/article ...

  4. SpringBoot内嵌数据库的使用(H2)

    配置数据源(DataSource) Java的javax.sql.DataSource接口提供了一个标准的使用数据库连接的方法. 传统做法是, 一个DataSource使用一个URL以及相应的证书去构 ...

  5. 补习系列(17)-springboot mongodb 内嵌数据库

    目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...

  6. 补习系列(17)-springboot mongodb 内嵌数据库【华为云技术分享】

    目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...

  7. JAVA内嵌数据库H2的使用入门

    H2数据库是开源的,非常适合做嵌入式数据库使用,尤其用java编码的时候. H2的优势: 1.h2采用纯Java编写,因此不受平台的限制. 2.h2只有一个jar文件,十分适合作为嵌入式数据库试用. ...

  8. Android中如何使用命令行查看内嵌数据库SQLite3

    转载博客:http://www.linuxidc.com/Linux/2011-06/37135.htm 在上图中,除了最后一个红色的方框,其它方框都是adb shell下的命令. [1]在Andro ...

  9. AgileBoot - 如何集成内置数据库H2和内置Redis

    本项目地址: github: https://github.com/valarchie/AgileBoot-Back-End gitee: https://gitee.com/valarchie/Ag ...

随机推荐

  1. Java中properties可以读取,但是里面的数据读取不到

    今天配置一个项目jdbc.properties这个文件里面的键值总是读取不到,刚开始以为是文件没有读取到,但是测试是读取到的,再排查键值是不是写错了, 后来发现键值是对的,这就很奇怪了 比较是没有任何 ...

  2. 关于centos6版本执行程序报错:libc.so.6: version GLIBC_2.14 not found的解决

    执行后程序报错: libc.so.6: version GLIBC_2.14 not found 这种情况是因为当前服务器glibc的版本比较低造成的(不出意外是glibc_2.12是最高版本): 1 ...

  3. JavaWeb_(Spring框架)SpringAOP面向切面编程

    SpringAOP:面向切面编程(面向fifter编程) 通俗易懂术语:所有纵向重复的代码,我们提取成横向的代码 以下文章内容参考知乎:从0带你学习SpringAOP,彻底的理解AOP思想 传送门 1 ...

  4. if-for-while

    if help if可以看看if的用法 if ls -l / ;then echo "ok";else echo "no" ;fi for for ((i=0; ...

  5. 网络流,设备、插头和转接器建图(简单map的应用)

    题意: 给你n个插座,m个设备,每台设备都有对应的插座,有k个转接器. 要求:求满足不能插上插座的用电器最少个数 solution: HINT:每种适配器都有无限个,所以建图的时候要改为INF. 答案 ...

  6. QAbstractTableModel中的data()到底执行几遍???

    发现问题的过程  1.一个普通的继承 QAbstractTableModel 的类 class CurrencyModel : public QAbstractTableModel { public: ...

  7. 1.2 位于Shell脚本第一行的#!

    学习<shell脚本学习指南>一书,记录总结,便于自己回忆,希望对你有帮助! 2.4 自给自足的脚本:位于第一行的 #! 1.Shell脚本执行过程 当Shell执行一个程序时,会要求UN ...

  8. LC 926. Flip String to Monotone Increasing

    A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possibly 0), ...

  9. OriginPro 9.1 科研图标绘制入门

    OriginPro 9.1 科研图标绘制入门 目的:1.介绍如何不用编程画出复杂多样的图表2.介绍OriginLab 常用功能3.科研报告时,有效绘图,省却时间 科研发展需求.反映专业形象.满足公司要 ...

  10. C语言中函数strcpy ,strncpy ,strlcpy的用法

    strcpy ,strncpy ,strlcpy的用法 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界. 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式. 1. s ...