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 ...
随机推荐
- table表格合并列中相同的内容
方法一: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- 第四届西安邮电大学acm-icpc校赛 热狗树
题目描述 “我是番茄酱!”“我是黄芥末酱!”“合在一起就是——美式热狗上加的,那个!“热狗树上的每个节点都涂有番茄酱或者黄芥末酱中的一种,这样热狗树就变得美味了~LiMn2O4构造了一颗热狗树,他想 ...
- centos与debian网卡
debian /etc/network/interfaces # This file describes the network interfaces available on your sys ...
- python上下文小记
python访问数据库是日常编程中经常使用的,一般的代码如下: 可以看出样例代码还是比较多的,有没有办法优化一下呢?有! def send_msgs(conn_id=None, **kwargs): ...
- SpringMVC 理论
应用系统三层架构: C/S:客户端/服务器 B/S:浏览器/服务器 标准分层: 表现层:WEB 层,接受结果,响应结果,分发请求:通常客户端使用 http 协议请求 web 层,web 层需要接受 h ...
- webpack入门-配置项
一.常用配置 1.enter(表示入口,webpack从此处开始构建) 2.output(配置输出结果) 3.module(关于模块的配置,内部可以配置loader) 4.resolve(配置寻找模块 ...
- php多线程的概念
来源:http://www.cnblogs.com/zhenbianshu/p/7978835.html 多线程 线程 首先说下线程: 线程(thread) 是操作系统能够进行运算调度的最小单位.它被 ...
- Windows/Linux C/C++任意键继续
#include <stdio.h> #include <stdlib.h> #ifdef _WIN32 #include <stdlib.h> #else #in ...
- 关于go module
从Go 1.11开始引入module,用于版本管理. 通过使用module,工程目录的位置不用必须放在GOPATH下. 当前版本是1.13,下文中将以Go1.13为例介绍module. 在Go 1.1 ...
- 多目标优化算法(一)NSGA-Ⅱ(NSGA2)(转载)
多目标优化算法(一)NSGA-Ⅱ(NSGA2) 本文链接:https://blog.csdn.net/qq_40434430/article/details/82876572多目标优化算法(一)NSG ...