目录
H2 Database 概述
Connection Modes(连接模式)
H2 下载与安装
H2 Database 使用入门
创建H2数据库
连接H2数据库
操作H2数据库
修改 H2 默认端口
Database URL 概述
H2 Database 概述
1、H2 是一个开源的嵌入式数据库引擎,纯 java 实现的关系型数据库,不受平台的限制。
2、H2 提供了一个 web 控制台用于操作和管理数据库内容,可以执行sql。
3、官方地址:http://www.h2database.com/html/main.html,官方介绍如下:
Very fast, open source, JDBC API(性能快速,代码开源,JDBC 即可操作,支持 SQL 标准)
Embedded and server modes; in-memory databases(支持网络版和嵌入式版本,以及内存版)
Browser based Console application (提供了基于web的数据库管理界面)
Small footprint: around 2 MB jar file size(占用空间小,大约2 MB jar文件大小)
4、其中最为常用的就是它的嵌入式版本,只需像平时使用其它库一样,导入 H2 的 jar 包到 Java 应用中即可使用 H2 数据库。
Features(特性)
1、下表中 H2,Derby,HSQLDB,MySQL,PostgreSQL 都是常用的开源数据库。
数据库对比 | H2 | ||||
Pure Java(是否纯java编写) | Yes | Yes | Yes | No | No |
Memory Mode(是否支持内存存储模式) | Yes | Yes | Yes | No | No |
Encrypted Database(是否是加密数据库) | Yes | Yes | Yes | No | No |
ODBC Driver(是否支持 ODBC 驱动) | Yes | No | No | Yes | Yes |
Fulltext Search(是否支持全文检索) | Yes | No | No | Yes | Yes |
Multi Version Concurrency(多版本并发控制) | Yes | No | Yes | Yes | Yes |
Footprint (embedded)(嵌入式jar包大小) | ~2 MB | ~3 MB | ~1.5 MB | — | — |
Footprint (client)(客户端大小) | ~500 KB | ~600 KB | ~1.5 MB | ~1 MB | ~700 KB |
更多特性可以参考官网:http://www.h2database.com/html/features.html#connection_modes
官方使用文档下载
1、官网首页:http://www.h2database.com/html/download.html 的左侧的"Reference"下有一个 "PDF(1.5M)"选项,点击即可进入下载页
Connection Modes(连接模式)
1、The following connection modes are supported(H2 支持以下连接模式):
1)Embedded mode (local connections using JDBC)——嵌入式模式(使用JDBC的本地连接)
2)Server mode (remote connections using JDBC or ODBC over TCP/IP)——服务器模式(通过TCP/IP使用JDBC或ODBC的远程连接)
3)Mixed mode (local and remote connections at the same time)——混合模式(同时支持本地和远程连接)
Embedded mode(嵌入式模式):嵌入式模式下,应用程序使用JDBC从相同的JVM中打开数据库。这是最快和最简单的连接模式。缺点是数据库可能在任何时候只在一个虚拟机(和类装入器)中打开。与所有模式一样,持久数据库和内存数据库都受到支持。并发打开的数据库数量或打开的连接数量没有限制。
Server Mode(服务器模式):服务器模式(有时称为远程模式或客户机/服务器模式)下,应用程序使用JDBC或ODBC API远程打开数据库。服务器需要在相同的或另一台虚拟机中启动,或在另一台计算机上启动。应用程序连接到这个数据库服务器,许多应用程序可以同时连接到同一个数据库。在内部,服务器进程以嵌入式模式打开数据库。
服务器模式比嵌入式模式慢,因为所有数据都是通过TCP/IP传输的。与所有模式一样,持久数据库和内存数据库都受到支持。每个服务器并发打开的数据库数量或打开的连接数量没有限制。
Mixed Mode(混合模式):混合模式是嵌入式模式和服务器模式的组合。连接到数据库的第一个应用程序在嵌入式模式下执行此操作,同时也作为服务器启动,以便其他应用程序(运行在不同的进程或虚拟机中)可以并发访问相同的数据。本地连接的速度与仅在嵌入式模式下使用数据库的速度一样快,而远程连接则稍慢一些。
可以从应用程序内部(使用服务器API)或自动(自动混合模式)启动和停止服务器。在使用自动混合模式时,希望连接到数据库的所有客户机(无论它是本地连接还是远程连接)都可以使用完全相同的数据库URL来连接数据库。
更多详细参考官网:http://www.h2database.com/html/features.html
H2 下载与安装
1、进入下载页进行下载:http://www.h2database.com/html/download.html
Version 1.4.198 (2019-02-22)
Windows Installer (SHA1 checksum: 20dd1e86a5f3ff897be4b9594a61bcacfc26dc21)
Platform-Independent Zip (SHA1 checksum: 1fe277abbb5c2840471f67e0b0895c23c49a6608)
2、Windows Install:一个 exe 安装程序,相当于 H2 数据库安装版的客户端,可以用于连接数据库,然后进行操作。
3、Platform-Independent Zip:一个 .zip 压缩文件,里面包含了二进制开发 Jar 包,整个官网的网页文档,以及 PDF 文档,项目源码,快捷操作脚本。建议下载这一个全家桶,解压后如下所示:
h2
|---bin
| |---h2-1.4.198.jar //H2 数据库jar包(包含驱动)
| |---h2.bat //Windows控制台启动脚本
| |---h2.sh //Linux控制台启动脚本
| |---h2w.bat //Windows控制台启动脚本(不带黑屏窗口,后端运行)
|---docs //H2数据库的帮助文档(内有H2数据库的使用手册)
| |---h2.pdf //PDF 帮助文档
| |---index.html //网页版帮助文档
|---service //通过wrapper包装成服务,以服务的方式运行
|---src //H2数据库的源代码
|---build.bat //windows构建脚本
|---build.sh //linux构建脚本
4、如上所示点击 "connect" 时报错数据库未找到,这是因为现在是第一次下载 H2 Database,JDBC URL (~/test:表示当前用户根目录下的test数据库)下暂时未曾生成过数据库文件,所以找不到而报错,等后期创建项目生成了 h2 数据库文件后,便可以连接了。
5、.sh、.bat 是启动 h2-1.4.198.jar 的快捷脚本,其实直接双击 h2-1.4.198.jar 运行也是可以的,而且可以将 h2-1.4.198.jar 拷贝到任何安装了 Java JDK,配置了 JDK 环境变量的电脑的任何位置直接运行。
H2 Database 使用入门
创建H2数据库
1、上面已经看到,运行之后连接数据库失败,所以第一步就是要创建 H2 数据库。
2、Windows 系统运行 h2.bat、h2w.bat、h2-1.4.198.jar 都可以,区别在于 h2.bat 会弹出一个黑色的 DOS 窗口,后两个不会,注意 h2.bat、h2w.bat 必须保持和 h2-1.4.198.jar 在一起才能运行,而 h2-1.4.198.jar 却可以自己单独在任意位置运行。
3、运行之后程序会自动调用默认浏览器打开 H2 Console 控制台,地址如:http://192.168.58.1:8082/login.jsp?jsessionid=ab61f33cf33fc4e35260b9f8a3ba7a73。可以看到 h2 数据库连接默认使用的是 8082 端口,后面会介绍如何修改这个默认端口
4、程序运行之后,任务栏会出现 H2 的小图标,右击图标,有如下菜单:
1)H2 Console:点击之后,会自动调用默认浏览器打开 H2 网页控制台,每点击一次就打开一次新的,每一个 H2 Console 控制台都可以进行 “Connect”(连接)数据库,然后进行操作
2)Create a new database..:创建新数据库,数据库可以使用 Java 程序来自动创建,也可以使用这个客户端手动创建。
3)Status:H2 连接地址的状态信息,点击之后,会提示信息如:H2 Console URL:http://192.168.1.20:8082;
4)Exit:退出,点击之后,即可退出此客户端。
5、点击 "Create a new database.." 菜单后如下所示:
Database Path:数据库文件路径,会自动以路径结尾的名称作为数据库名称
填写完成后,点击 "Create" 即可创建数据库成功,数据库文件以 .mv.db 结尾。
连接H2数据库
1、数据库创建之后,便可以使用 H2 控制台进行连接操作,如下所示连接的就是上面创建好的 testH2_2 数据库。
1、左上角可以设置语言,默认是英文
2、连接设置:Generic H2(Embedded)表示嵌入式连接模式,还有服务器模式 Server Model
3、驱动类:固定为 org.h2.Driver,这是 H2 的 jar 文件 h2-1.4.198.jar 中带好了的
4、JDBC URL:JDBC 连接的数据库地址,指向创建好的数据库自动即可,可以是绝对路径,也可以相对路径,如果是服务器模式,还可以 TCP 路径,即可以连接远程电脑上的 H2 数据库,不限于本地。
5、用户名、密码:填写创建数据库时设置的账号与密码即可
6、最后可以点击 “连接测试” 看是否能连接成功,然后点击 “连接”便可以连接进入
操作H2数据库
1、H2 Database 是支持 SQL 标准的,所以增删改查、建表、删表等 SQL 与之前操作 Mysql 完全一致。
2、下面以如下所示的语句进行演示:
//创建表
drop table if exists user;
CREATE TABLE IF NOT EXISTS user (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) DEFAULT NULL,
pwd varchar(50) DEFAULT NULL,
PRIMARY KEY (id)
);
//插入数据
INSERT INTO USER VALUES (NULL,'zhangsan' ,'123456' );
INSERT INTO USER VALUES (NULL,'lisi' ,'123456' );
INSERT INTO USER VALUES (NULL,'wagnwu' ,'123456' );
//查询所有数据
SELECT * FROM USER;
//删除 lisi
DELETE FROM USER WHERE name = 'lisi';
//查询所有数据
SELECT * FROM USER;
//删除表
DROP TABLE IF EXISTS user;
3、至于 H2 Console 控制台的操作也很简单:
4、现在演示的是手动操作 H2-version.jar 数据库的方式,后续会演示如何导入 H2-version.jar 到 Java 项目中,通过代码来进行操作 H2 数据库。
修改 H2 默认端口
1、从上面的截图中可以看到,默认情况下 H2 Database 使用的 8082 端口
2、当 H2 Console 控制台点击 "Connect" 连接数据库,连接成功时,则会在系统当前登录用户的根目录下自动生成一个 ".h2.server.properties"文件(内容变化时会自动更新)。
3、.h2.server.properties 配置文件内容如下:
#H2 Server Properties
#Thu Feb 28 13:33:11 CST 2019
0=Generic JNDI Data Source|javax.naming.InitialContext|java\:comp/env/jdbc/Test|sa
1=Generic Teradata|com.teradata.jdbc.TeraDriver|jdbc\:teradata\://whomooz/|
10=Generic DB2|com.ibm.db2.jcc.DB2Driver|jdbc\:db2\://localhost/test|
11=Generic Oracle|oracle.jdbc.driver.OracleDriver|jdbc\:oracle\:thin\:@localhost\:1521\:XE|sa
12=Generic MS SQL Server 2000|com.microsoft.jdbc.sqlserver.SQLServerDriver|jdbc\:microsoft\:sqlserver\://localhost\:1433;DatabaseName\=sqlexpress|sa
13=Generic MS SQL Server 2005|com.microsoft.sqlserver.jdbc.SQLServerDriver|jdbc\:sqlserver\://localhost;DatabaseName\=test|sa
14=Generic PostgreSQL|org.postgresql.Driver|jdbc\:postgresql\:test|
15=Generic MySQL|com.mysql.jdbc.Driver|jdbc\:mysql\://localhost\:3306/test|
16=Generic HSQLDB|org.hsqldb.jdbcDriver|jdbc\:hsqldb\:test;hsqldb.default_table_type\=cached|sa
17=Generic Derby (Server)|org.apache.derby.jdbc.ClientDriver|jdbc\:derby\://localhost\:1527/test;create\=true|sa
18=Generic Derby (Embedded)|org.apache.derby.jdbc.EmbeddedDriver|jdbc\:derby\:test;create\=true|sa
19=Generic H2 (Server)|org.h2.Driver|jdbc\:h2\:tcp\://localhost/~/test|sa
2=Generic Snowflake|com.snowflake.client.jdbc.SnowflakeDriver|jdbc\:snowflake\://accountName.snowflakecomputing.com|
20=Generic H2 (Embedded)|org.h2.Driver|jdbc\:h2\:E\:\\\\wmx\\\\h2Database\\\\testH2_2|sa
3=Generic Redshift|com.amazon.redshift.jdbc42.Driver|jdbc\:redshift\://endpoint\:5439/database|
4=Generic Impala|org.cloudera.impala.jdbc41.Driver|jdbc\:impala\://clustername\:21050/default|
5=Generic Hive 2|org.apache.hive.jdbc.HiveDriver|jdbc\:hive2\://clustername\:10000/default|
6=Generic Hive|org.apache.hadoop.hive.jdbc.HiveDriver|jdbc\:hive\://clustername\:10000/default|
7=Generic Azure SQL|com.microsoft.sqlserver.jdbc.SQLServerDriver|jdbc\:sqlserver\://name.database.windows.net\:1433|
8=Generic Firebird Server|org.firebirdsql.jdbc.FBDriver|jdbc\:firebirdsql\:localhost\:c\:/temp/firebird/test|sysdba
9=Generic SQLite|org.sqlite.JDBC|jdbc\:sqlite\:test|sa
webAllowOthers=false
webPort=8082
webSSL=false
webAllowOthers:表示是否运行进行远程 web 连接
webPort:表示浏览器访问时的端口
webSSL:表示是否加密传输
其它 0、1、2...这些全是配置,包括 JDBC URL 地址中的连接模式与连接设置都会在其中进行记录,当下一次连接时,如果 JBCD URL 地址中的参数发送变化,则会自动更新此文件。
4、于是当修改 .h2.server.properties 中的 webPort=7072 之后, H2 Console 再次访问时必须使用 7072 端口了。
1)修改 .h2.server.properties 配置文件后,需要先退出 h2-version.jar 应用,重启后生效。
2)同理使用 Java 应用配置 H2 数据源进行操作时,如果 JDBC URL 地址发生变化,同样会自动修改此文件。
Database URL 概述
1、H2 数据库通过使用不同的 JDBC URL 地址实现多种连接模式和连接设置,URL中的设置不区分大小写
2、JDBC URL 不止会在 H2 Console 控制台使用,在 Java 项目使用 H2 数据库,配置数据源时也会进行使用。
3、连接模式指的就是 H2 的 3中连接模式(嵌入式模式、服务器模式、混合模式),连接设置指的是连接数据库时的设置,比如:是否自动重连、字符编码、数据库是否只读、Java 虚拟机退出时 H2数据库是否关闭、加密数据库文件 等等。
4、如下这些 JDBC URL 地址都可在官网找到:http://www.h2database.com/html/features.html
Database URL Overview
Topic | URL Format and Examples |
Embedded (local) connection (嵌入式模式,支持本地连接) | jdbc:h2:[file:][<path>]<databaseName> "[]" 表示可省略 jdbc:h2:~/test "~" 表示系统当前登录用户的根目录 jdbc:h2:file:/data/sample jdbc:h2:file:C:/data/sample (Windows only) |
In-memory (private) 内存模式运行,数据不会持久化。每个连接都是私有的,大家互不影响. | jdbc:h2:mem 默认情况下,关闭到数据库的最后一个连接将关闭数据库。对于内存数据库,这意味着内容丢失,若要保持数据库打开,设置 DB_CLOSE_DELAY=-1 参数. |
In-memory (named) 内存模式运行,数据不会持久化。大家公用同一个数据库名称 named | jdbc:h2:mem:<databaseName> jdbc:h2:mem:test_mem |
Server mode (remote connections) using TCP/IP (服务器模式,支持远程连接) | jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName> jdbc:h2:tcp://localhost/~/test "~" 表示系统当前登录用户的根目录 jdbc:h2:tcp://dbserv:8084/~/sample jdbc:h2:tcp://localhost/mem:test |
Server mode (remote connections) using TLS | jdbc:h2:ssl://<server>[:<port>]/[<path>]<databaseName> jdbc:h2:ssl://localhost:8085/~/sample; |
Using encrypted files (是否加密数据库文件) | jdbc:h2:<url>;CIPHER=AES jdbc:h2:ssl://localhost/~/test;CIPHER=AES jdbc:h2:file:~/secure;CIPHER=AES |
File locking methods | jdbc:h2:<url>;FILE_LOCK={FILE|SOCKET|NO} jdbc:h2:file:~/private;CIPHER=AES;FILE_LOCK=SOCKET |
Only open if it already exists (是否只打开已经存在的数据库,默认情况下,如果数据库不存在,则会新建) | jdbc:h2:<url>;IFEXISTS=TRUE jdbc:h2:file:~/sample;IFEXISTS=TRUE |
Don't close the database when the VM exits (Java虚拟机退出时是否关闭H2数据库,默认情况下,最后一个连接断开后,数据库就会关闭) | jdbc:h2:<url>;DB_CLOSE_ON_EXIT=FALSE |
Execute SQL on connection | jdbc:h2:<url>;INIT=RUNSCRIPT FROM '~/create.sql' jdbc:h2:file:~/sample;INIT=RUNSCRIPT FROM '~/create.sql'\;RUNSCRIPT FROM '~/populate.sql' |
User name and/or password (用户账号与密码) | jdbc:h2:<url>[;USER=<username>][;PASSWORD=<value>] jdbc:h2:file:~/sample;USER=sa;PASSWORD=123 |
Debug trace settings (调试追踪设置,用于打印信息,根据跟踪文件生成数据库) | jdbc:h2:<url>;TRACE_LEVEL_FILE=<level 0..3> jdbc:h2:file:~/sample;TRACE_LEVEL_FILE=3 |
Ignore unknown settings | jdbc:h2:<url>;IGNORE_UNKNOWN_SETTINGS=TRUE |
Custom file access mode (自定义读取模式,如是否只读,读写等) | jdbc:h2:<url>;ACCESS_MODE_DATA=rws |
Database in a zip file | jdbc:h2:zip:<zipFileName>!/<databaseName> jdbc:h2:zip:~/db.zip!/test |
Compatibility mode (兼容模式) | jdbc:h2:<url>;MODE=<databaseType> jdbc:h2:~/test;MODE=MYSQL |
Auto-reconnect (自动重连) | jdbc:h2:<url>;AUTO_RECONNECT=TRUE jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE |
Automatic mixed mode (自动混合模式。默认情况下,H2 只运行一个进程访问,true 表示可以多个进程可以访问同一个数据库) | jdbc:h2:<url>;AUTO_SERVER=TRUE jdbc:h2:~/test;AUTO_SERVER=TRUE |
Page size (数据库页面大小,默认为 2KB,无法修改现有数据库的页面大小,必须在创建时进行指定) | jdbc:h2:<url>;PAGE_SIZE=512 |
Changing other settings | jdbc:h2:<url>;<setting>=<value>[;<setting>=<value>...] jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3 |
5、这些设置都可以通过追加 JDBC URL 的后面达到相应的效果,当连接成功后,这些连接参数都会记录在 .h2.server.properties 配置文件中。