H2数据库学习笔记
H2数据库是一个开源的关系型数据库,采用Java语言编写的嵌入式数据库引擎,它就是一个类库(因为是Java语言编写的,所以对外提供的是一个jar包文件),可以直接嵌入到应用的项目中,不受平台的限制(一个jar包,随用随引用)。
H2 数据库官网
H2的优势
- 纯java编写,不受平台限制。
- 只有一个jar文件,适合作为嵌入式数据库使用。
- h2还提供了一个web控制台,用于造作和管理数据内容,但其缺点就是要启动应用才可以查看这个控制台页面。
- 功能完整,支持标准的SQL和JDBC。
- 支持内嵌模式、服务器模式和集群。
H2数据库内嵌到应用中
h2数据库可以有内嵌模式,和服务器模式。如果使用内嵌模式,需要按照以下步骤操作:
- 添加
h2*.jar
到项目中(H2不需要其他的依赖) - 使用
JDBC
驱动类:org.h2.Driver
- 数据库URL
jdbc:h2:~/test
将在本地用户目录下打开一个名为test
的数据库 - 一个新的数据库就自动创建完成了
H2提供了一个数据库查看页面
在这个页面中,你可以操作数据库表和数据。
数据库启动后,打开历览器:http:localhost:8082
打开数据库管理页面
可以在配置文件中设置数据密码。
登录进入页面后:
这里可以对数据库表和数据进行操作,可以执行sql语句。
安装对用的H2数据文件(zip文件或者jar文件)
本地安装完成后,对应的文件夹目录及作用如下:
H2数据库的特性
主要特性
- 非常快速的数据库引擎
- 开源的
- 由Java语言编写
- 支持标准的SQL、JDBC API
- 有内嵌模式、服务模式、集群
- 强大的安全性
- 可以使用PostgreSQL ODBC驱动程序
- 多版本并发
附加特性
- 基于磁盘或内存中的数据库和表、只读数据库支持、临时表
- 事务支持(读提交),两阶段提交
- 支持多连接和表级锁定
- 基于成本的优化器,使用遗传算法进行复杂查询,零管理
对SQL的支持
- 支持多种约束和信息约束
- 具有级联的参照完整性/外键约束,检查约束
- 内部和外部联接、子查询、只读视图和内联视图
- 触发器和 Java 函数/存储过程
- 许多内置功能,包括 XML 和无损数据压缩
- 广泛的数据类型,包括大对象 (BLOB/CLOB) 和数组
- 序列和自动增量列、计算列(可用于基于函数的索引)
- 支持用户和角色
- 对很多开源数据都兼容。(IBM DB2、Apache Derby、HSQLDB、MS SQL Server、MySQL、Oracle 和 PostgreSQL)
安全特性
- 包括 SQL 注入问题的解决方案
- 支持用户密码认证,使用SHA-256 和 salt
- 对于服务器模式的连接,用户密码永远不会通过网络以纯文本形式传输(即使使用不安全的连接;这仅适用于 TCP 服务器,但不适用于 H2 控制台;也不允许您在 数据库网址中设置密码)
- 所有数据库文件(包括可用于备份数据的脚本文件)均可使用 AES-128 加密算法进行加密
- 远程 JDBC 驱动程序支持通过 TLS 的 TCP/IP 连接
- 内置网络服务器支持通过 TLS 的连接
- 可以使用字符数组而不是字符串将密码发送到数据库
其他特性
- 占用空间小(约2M),内存要求低
- 多种索引类型(b-tree、tree、hash)
- 支持复合索引
- 支持CSV文件(逗号分隔值)
- 支持链接表和内置的虚拟“范围”表
- 支持 EXPLAIN PLAN 语句; 复杂的跟踪选项
- 可以延迟或禁用数据库关闭以提高性能
- 具有基于web控制台的应用程序
- 数据库可以生成SQL脚本文件
- 包含可以转储数据库内容的恢复工具
- 支持变量(例如计算运行总数)
- 自动重新编译准备好的语句
- 使用少量数据库文件
- 对每个记录和日志条目使用校验和以确保数据完整性
- 测试良好(高代码覆盖率,随机压力测试)
数据URL类型及其解释
该数据库支持多种连接方式和连接设置。 这是使用不同的数据库 URL 实现的。 URL 中的设置不区分大小写。
H2支持的数据类型
INT类型:对应java.lang.Integer
REAL类型:对应java.lang.Float
DOUBLE类型:对应java.lang.Double
DECIMAL类型:对应java.math.BigDecimal,比如DECIMAL(20,2)
CHAR类型:对应java.lang.String,比如CHAR(10)
VARCHAR类型:对应java.lang.String
VARCHAR_IGNORECASE类型:对应java.lang.String,忽略大小写
BOOLEAN类型:对应java.lang.Boolean
TIME类型:对应java.sql.Time,当转换成java.sql.Date时,日期会设置成1970-01-01
DATE类型:对应java.sql.Date,格式为yyyy-MM-dd,其时间默认为00:00:00
TIMESTAMP类型:对应java.sql.Timestamp,格式为yyyy-MM-dd hh:mm:ss[.nnnnnnnnn],也支持java.util.Date
TINYINT类型:对应java.lang.Byte,-128 to 127
SMARTINT类型:对应java.lang.Short,-32768 to 32767
BIGINT类型:对应java.lang.Long
IDENTITY类型:自增类型,对应java.lang.Long,值范围-9223372036854775808 to 9223372036854775807
BINARY类型:二进制字节存储,最大不超过2GB,且完全保存在内存,比如BINARY(1000)
BLOB类型:对应java.sql.Blob,与BINARY相似,但针对很大的数据(如文件或图像),且不完全保存在内存,使用PreparedStatement.setBinaryStream来保存数据。
CLOB类型:与VARCHAR相似,但适用于保存很大的数据,且数据不完全保存在内存。用于任意尺寸的XML或HTML文档、文本文件等。使用PreparedStatement.setCharacterStream保存数据。
OTHER类型:对应java.lang.Object,用于存储序列化的Java对象,使用的是字节数组,客户端只能做序列化或反序列化,使用getObject反序列化,使用PreparedStatement.setObject存储数据。
UUID类型:对应java.util.UUID,128位的值,可以使用PreparedStatement.setBytes或setString或setObject(uuid)保存数据,使用ResultSet.getObject取回数据。
ARRAY类型:对应java.lang.Object[]
H2数据库常用的函数
CURRENT_DATE:取当前日期
CURRENT_TIME:取当前时间
CURRENT_TIMESTAMP:取当前日期时间
LOWER:字符串小写
UPPER:字符串大写
CONCAT:字符串连结
CHAR:ASCII值转字符
ASCII:字符转ASCII值
ENCRYPT:加密函数,支持AES算法,Block尺寸为16字节,
比如CALL ENCRYPT('AES', '00', STRINGTOUTF8('Test'))
DECRYPT:解密函数,支持AES算法,Block尺寸为16字节,
比如CALL TRIM(CHAR(0) FROM UTF8TOSTRING(
DECRYPT('AES', '00', '3fabb4de8f1ee2e97d7793bab2db1116')))
HASH:哈希函数,只支持SHA256算法,比如CALL HASH('SHA256', STRINGTOUTF8('Password'), 1000)
MAX:求最大
MIN:求最小
SUM:求和
CURRENT_USER:返回当前用户
H2VERSION:返回H2数据库的版本
DISK_SPACE_USED:返回表使用的磁盘空间尺寸,比如CALL DISK_SPACE_USED('my_table');
DATABASE_PATH:返回数据库文件的路径和数据库名,比如CALL DATABASE_PATH();
H2做单元测试
springboot结合hibernate与h2数据库做单元测试,模拟真实数据库时,若使用了@Audited注解,则jpa会自动基于表映射,生成一个记录表操作历史的表,该表以XXX_aud的表明存在,这个表中会自动添加 rev字段和revtype字段,其中revtype字段为tinyint类型,所以,如果模拟的数据库不支持tinyint类型的数据,则该表无法创建。