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 8082 -browser
## TCP服务方式
java -jar h2*.jar org.h2.tools.Server -tcp -tcpPort 9092 -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数据库成功..."); } } }