参考:
H2数据库使用与管理入门 https://blog.csdn.net/fanpeizhong/article/details/73543260
H2 Database使用教程 https://blog.csdn.net/RYAN0UP/article/details/80790836
H2 Database入门 https://www.cnblogs.com/yjmyzz/p/H2-database-tutorial.html
1H2数据库简介
H2是一个用Java开发的嵌入式数据库,只有一个jar文件,它本身只是一个类库,不仅能以server模式运行,甚至能直接嵌入到应用项目中,因此它的作用有:
- 应用程序打包在一起发布,可以非常方便地存储少量结构化数据。
- 正因为它的嵌入式特性,还可以用于单元测试,从而可以不用为了单元测试而去Mcok数据库返回值,而直接使用真实的数据库。在用于单元测试中,H2还可以关闭持久化功能,每一个用例执行完随即还原到初始状态。
- 作为缓存,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以拿它当Memcached使,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表。
- 作为真正的数据库使用,有服务器模式、嵌入/集成模式、混合模式
2下载和安装
官网下载,windows可执行文件安装版本和全平台通用版本,通用版解压后的文件结构是:
h2
|—bin
| |—h2-1.1.116.jar //H2数据库的jar包(驱动也在里面)
| |—h2.bat //Windows控制台启动脚本
| |—h2.sh //Linux控制台启动脚本
| |—h2w.bat //Windows控制台启动脚本(不带黑屏窗口)
|—docs //H2数据库的帮助文档(内有H2数据库的使用手册)
|—service //通过wrapper包装成服务。
|—src //H2数据库的源代码
|—build.bat //windows构建脚本
|—build.sh //linux构建脚本
所有平台,都是通过脚本启动。
运行模式:
- 内存模式:运行时的数据只保存在内存中,不回写到文件中
- 内嵌模式:和工程一起打包。可以作为缓存,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以拿它当Memcached使,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表
- 服务器模式:
- TCP/IP server:支持客户端/服务器端的连接方式
- web server:此种运行方式支持使用浏览器访问H2 Console
- PG server:支持PostgreSQL客户端
3运行
3.1windows环境
- 创建数据库
运行./bin/h2w.bat,状态栏中会出现h2数据库的图标,右键数据库图标,选择新建一个数据库。例子如下:
由于在非内存模式下的h2数据库,本质是文件型数据库,因此,“数据库路径”要填写数据库在本地的绝对地址,用户名、密码什么的随意即可。务必记住此处的数据库的本地绝对路径。创建完成之,接下来分别以服务器(server)模式和嵌入式(embedded)模式。
3.1.1 jdbc server连接
- 在h2控制台测试一下连接是否正常,我的以server模式,连接正常。这一步的目的是,手动启动数据库server模式。
- 使用maven引入h2的驱动类
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>
- jdbc代码实现
String jdbcUrl = "jdbc:h2:tcp://localhost/C:\\CRroot\\documents\\test";//绝对路径中可以都换成反斜杠
String userName = "jeason";
String passward = "jeason";
Connection testDbConnection = null;
DriverManager.setLoginTimeout(1);
testDbConnection = DriverManager.getConnection(jdbcUrl, userName, passward);
System.out.println(testDbConnection.isReadOnly());
代码实现中,url的含义是,通过tcp协议,访问了localhost这个IP上的,这个路径“C:\CRroot\documents\test”中的数据库,想连接别IP的数据库,更改localhost为目标IP即可。
3.1.2嵌入模式
按道理,和server唯一的不同是,不需要手动启动h2数据库,并且jdbc的url改为以下即可:
String jdbcUrl = "jdbc:h2:C:\\CRroot\\documents\\test";
但是要注意connection的关闭,要不然回报连接已经在使用中……
3.1.3内存模式
String jdbcURL = "jdbc:h2:mem:h2db";//使用本机内存中的h2db数据库
// 或者
String jdbcURL = "jdbc:h2:tcp://localhost/mem:h2db";//通过tcp协议使用某IP机器中内存中的h2db数据库
3.2inux环境
linux中H2使用脚本启动后,并不会像Windows一样,在状态栏中显示图标,无法点击图标预先创建一个数据库,然后以server模式进行连接。并且,如果一开始就server模式连接,必定会报以下错误:
Database “/root/te” not found, and IFEXISTS=true, so we cant auto-create it [90146-199] 90146/90146
因此,Linux下H2的使用方式是:
- 以h2.sh启动数据库后,如果想新建一个数据库,一定要先切换到Embedded模式,设置好用户名和密码,connect一下,即可进入后台。这时会根据在jdbc中填写的地址,在本地创建一个数据库文件。记住这个地址!
- 回退到登录界面,切换到server模式,会自动切换JDBC URL地址,同样的用户名和密码,connect一下
- 之后根据需求修改jdbc的url地址,进行数据库连接。
简单操作
创建grade表,要求该表包含id,teacher,class和grade列,对于name和sex列定义为字符型,
其他定义为int型,设置id列为主键列,除sex列外都不能为空。
create table grade
(
id int primary key not null,
teachername varchar(20) null,
sex varchar(5),
class int not null,
grade int not null
)