H2内嵌数据库的使用
H2内嵌数据库的使用
H2是一个开源的嵌入式数据库引擎,采用java语言编写,不受平台的限制。
同时H2提供了一个十分方便的web控制台用于操作和管理数据库内容。
H2还提供兼容模式,可以兼容一些主流的数据库,因此采用H2作为开发期的数据库非常方便。
H2作为一个嵌入型的数据库,它最大的好处就是可以嵌入到我们的Web应用中,和我们的Web应用绑定在一起,成为我们Web应用的一部分。
运行方式
H2数据库有三种运行方式实现:
嵌入式(embedded):可以同应用程序打包在一起发布,这样可以非常方便地存储少量结构化数据
服务模式:
TCP/IP server:支持客户端/服务器端的连接方式
web server:此种运行方式支持使用浏览器访问H2 Console
PG server:支持PostgreSQL客户端
内存方式:可以作为缓存,作为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内嵌数据库的使用的更多相关文章
- H2内嵌数据库使用步骤
1.找到h2数据库的jar包 D:\repositories\com\h2database\h2\1.4.187\h2-1.4.187.jar 2.双击jar包,配置连接信息 Driver Class ...
- SpringBoot使用H2内嵌数据库
1.驱动 我们知道,JDBC是JDK自带的接口规范,不同的数据库有不同的实现,只需要引入相应的驱动包即可. 在使用MySQL数据库时,引入的是MySQL驱动,相应的,使用H2数据库时,也需要引入H2驱 ...
- h2内嵌数据库使用
参考文档 1 https://www.cnblogs.com/xdp-gacl/p/4171024.html 参考文档 2 https://blog.csdn.net/mafan121/article ...
- SpringBoot内嵌数据库的使用(H2)
配置数据源(DataSource) Java的javax.sql.DataSource接口提供了一个标准的使用数据库连接的方法. 传统做法是, 一个DataSource使用一个URL以及相应的证书去构 ...
- 补习系列(17)-springboot mongodb 内嵌数据库
目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...
- 补习系列(17)-springboot mongodb 内嵌数据库【华为云技术分享】
目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...
- JAVA内嵌数据库H2的使用入门
H2数据库是开源的,非常适合做嵌入式数据库使用,尤其用java编码的时候. H2的优势: 1.h2采用纯Java编写,因此不受平台的限制. 2.h2只有一个jar文件,十分适合作为嵌入式数据库试用. ...
- Android中如何使用命令行查看内嵌数据库SQLite3
转载博客:http://www.linuxidc.com/Linux/2011-06/37135.htm 在上图中,除了最后一个红色的方框,其它方框都是adb shell下的命令. [1]在Andro ...
- AgileBoot - 如何集成内置数据库H2和内置Redis
本项目地址: github: https://github.com/valarchie/AgileBoot-Back-End gitee: https://gitee.com/valarchie/Ag ...
随机推荐
- Codevs 1137 计算系数 2011年NOIP全国联赛提高组
1137 计算系数 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定一个多项式(ax + by ...
- Java基础语法n
BK 分段函数(SDUT 2257) import java.util.*; public class Main{ public static void main(String[] args ...
- Java 多线程:什么是线程安全性
线程安全性 什么是线程安全性 <Java Concurrency In Practice>一书的作者 Brian Goetz 是这样描述"线程安全"的:"当多 ...
- JVM----双亲委派模型
加载类的开放性 我们在了解双亲委派模型之前,不得不先了解一下什么是类加载器.虚拟机设计团队之初是希望类加载过程“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作能放到虚拟机外部实现,以便于让 ...
- Linux系统Docker配置阿里云镜像加速器
vim /etc/docker/daemon.json # 替换为 "registry-mirrors": ["https://v2ltjwbg.mirror.aliyu ...
- UIGestureRecongnizer 手势拦截 对于特殊需求很有用
手势其实也有代理方法的,通过代理方法可以做到更多关于手势方面的功能 比如在下面的方法中,如果是UIButton的点击就阻止手势的点击事件. // called before touchesBegan: ...
- sed与awk
sed 格式 sed 选项 控制命令 文件或标准输入 sed 流程: (循环打印) sed是将文件里的每一行读入模式空间进行操作, sed选项 -r 支持正则表达 -n 取消默认打印 清空当前模式空间 ...
- Hibernate3核心API简介-Transaction接口
代表一次原子操作,它具有数据库事务的概念.所有持久层都应该在事务管理下进行,即使是只读操作. Transaction tx = session.beginTransaction();常用方法:c ...
- input 表单
1:datalist元素,一般与input组建配合使用,以定义可能输入的值,例如: <!DOCTYPE html> <html lang="en"> < ...
- 如何快速通过json构建javabean对象(Intellij IDEA-->GsonFormat使用教程)
和第三方对接的时候,返回给我们的json时参数字段多是很常见的现象,所以我们手动去创建javabean肯定是要花费不少时间,博主在网上找到了很多种,可用通过json自动生成javabean的工具,这里 ...