H2是一个开源的嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时H2提供了一个十分方便的web控制台用于操做和管理数据库内容。H2还提供兼容模式,能够兼容一些主流的数据库,所以采用H2做为开发期的数据库很是方便。java
1、引入Maven依赖
在maven中定义H2数据库的版本属性web
1
2
3
|
<
properties
>
<
h2.version
>1.3.172</
h2.version
>
</
properties
>
|
添加H2依赖spring
1
2
3
4
5
6
|
<
dependency
>
<
groupId
>com.h2database</
groupId
>
<
artifactId
>h2</
artifactId
>
<
version
>${h2.version}</
version
>
<
scope
>test</
scope
>
</
dependency
>
|
2、运行方式
一、在内存中运行
数据库只在内存中运行,关闭链接后数据库将被清空,适合测试环境sql
链接字符串:数据库
1
|
jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-
1
|
若是不指定DBName,则以私有方式启动,只容许一个链接apache
二、嵌入式
数据库持久化存储为单个文件数组
链接字符串:浏览器
1
|
jdbc:h2:file:~/.h2/DBName;AUTO_SERVER=TRUE
|
~/.h2/DBName表示数据库文件的存储位置,若是第一次链接则会自动建立数据库服务器
三、服务模式
H2支持三种服务模式:app
启动tcp服务链接字符串示例:
1
2
|
jdbc:h2:tcp:
//localhost/~/test 使用用户主目录
jdbc:h2:tcp:
//localhost//data/test 使用绝对路径
|
四、链接字符串参数
五、启动服务模式,打开H2 Console web页面
启动服务,在命令行中执行
1
|
java -cp h2*.jar org.h2.tools.Server
|
执行以下命令,获取选项列表及默认值
1
|
java -cp h2*.jar org.h2.tools.Server -?
|
常见的选项以下:
此外,使用maven也能够启动H2服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
project
xmlns
=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<
modelVersion
>1.0.0</
modelVersion
>
<
version
>1.0.0</
version
>
<
groupId
>groupid</
groupId
>
<
artifactId
>h2-console</
artifactId
>
<
name
>H2 Console</
name
>
<
packaging
>pom</
packaging
>
<
properties
>
<
h2.version
>1.3.172</
h2.version
>
</
properties
>
<
dependencies
>
<
dependency
>
<
groupId
>com.h2database</
groupId
>
<
artifactId
>h2</
artifactId
>
<
version
>${h2.version}</
version
>
<
scope
>runtime</
scope
>
</
dependency
>
</
dependencies
>
<
build
>
<
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
>8090</
argument
>
<
argument
>-browser</
argument
>
</
arguments
>
</
configuration
>
</
plugin
>
</
plugins
>
</
build
>
</
project
>
|
在命令行中执行以下命令启动H2 Console
mvn exec:java
或者创建一个bat文件
1
2
3
|
@echo
off
call mvn exec:java
pause
|
此操做至关于执行了以下命令:
1
|
java -jar h2-
1.3
.
168
.jar -web -webPort
8090
-browser
|
3、应用程序配置
一、Properties配置
java应用程序关于数据库的Properties配置文件示例以下:
1
2
3
4
5
6
7
8
|
#h2 database settings
jdbc.driver=org.h2.Driver
jdbc.url=jdbc:h2:file:~/.h2/quickstart;AUTO_SERVER=TRUE;DB_CLOSE_DELAY=-
1
jdbc.username=sa
jdbc.password=
#connection pool settings
jdbc.pool.maxIdle=
5
jdbc.pool.maxActive=
40
|
二、初始化数据库
(1)、在Maven中初始化数据库
能够建立一个Profile,专门用于初始化数据库。在maven中能够经过maven-antrun-plugin执行ant任务,在ant任务中使用sql标签能够执行sql脚本文件,配置示例以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<profile>
<id>refresh-db</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<configuration>
<target>
<property file=
"src/main/resources/application.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/test/resources/data/h2/import-data.sql"
/>
</sql>
</target>
</configuration>
</plugin>
</plugins>
</build>
</profile>
|
执行以下命令调用该Profile,初始化数据库
mvn antrun:run -Prefresh-db
(2)、在Spring中初始化数据库
Spring Profile和maven profile同样,也能够模拟不一样的开发环境。在Spirng中能够经过jdbc:initialize-database初始化数据库,配置示例以下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<beans profile=
"test"
>
<context:property-placeholder ignore-resource-not-found=
"true"
location="classpath*:/application.properties,
classpath*:/application.test.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:data/h2/import-data.sql"
encoding=
"UTF-8"
/>
</jdbc:initialize-database>
</beans>
|
4、sql语法图
一、SELECT
二、INSERT
三、UPDATE
四、DELETE
五、BACKUP
六、EXPLAIN
七、MERGE
八、RUNSCRIPT
运行sql脚本文件
九、SCRIPT
根据数据库建立sql脚本
十、SHOW
十一、ALTER INDEX RENAME
十二、ALTER SCHEMA RENAME
1三、ALTER SEQUENCE
1四、ALTER TABLE
增长列
增长约束
修改列
删除列
删除序列
1五、ALTER USER
修改用户名
修改用户密码
1六、ALTER VIEW
1七、COMMENT
1八、CREATE CONSTANT
1九、CREATE INDEX
20、CREATE ROLE
2一、CREATE SCHEMA
2二、CREATE SEQUENCE
2三、CREATE TABLE
2四、CREATE TRIGGER
2五、CREATE USER
2六、CREATE VIEW
2七、DROP
2八、GRANT RIGHT受权
给schema受权
复制角色的权限
2九、REVOKE RIGHT移除受权
移除角色具备的权限
30、ROLLBACK
从某个还原点(savepoint)回滚
回滚事务
建立savepoint
5、数据类型
H2支持以下数据类型
一、INT Type
值范围:-2147483648 – 2147483647
二、BOOLEAN Type
可选值:TRUE和FALSE
三、TINYINT Type
值范围:-128 -127
四、SMALLINT Type
值范围: -32768 to 32767
五、BIGINT Type
值范围:-9223372036854775808 – 9223372036854775807
六、IDENTITY Type
自动增加值
值范围:-9223372036854775808 – 9223372036854775807
七、DECIMAL Type
示例:DECIMAL(20, 2)
八、DOUBLE Type
九、REAL Type
浮点类型
十、TIME Type
时间类型,格式为:hh:mm:ss
11 、DATE Type
日期类型,格式为:yyyy-MM-dd
十二、TIMESTAMP Type
时间戳类型,格式为:yyyy-MM-dd hh:mm:ss[.nnnnnnnnn]
可映射为java对象:java.sql.Timestamp/java.util.Date
1三、BINARY Type
存储字节流,大数据建议使用BLOB类型存储
示例:BINARY(1000)
1四、OTHER Type
用于存储序列化的java对象
1五、VARCHAR Type
存储字符串,大文本数据建议使用CLOB类型存储
示例:VARCHAR(255)
1六、VARCHAR_IGNORECASE Type
与VARCHAR相似,可是不区分大小写
1七、CHAR Type
存储unicode字符串,与VARCHAR的区别是,尾部的空格不会被存储
1八、BLOB Type
存储大容量二进制流,最大存储2G数据
映射java对象类型为:java.sql.Blob /java.io.InputStream
1九、CLOB Type
用于存储大容量的文本数据
映射java对象类型为:java.sql.Clob/java.io.Reader
20、UUID Type
存储通用惟一识别码,占用128bit
2一、ARRAY Type
数组类型,使用一个值列表(1,2)或PreparedStatement.setObject(.., new Object[] {..})存储值
映射java对象类型为:java.lang.Object[]
2二、GEOMETRY Type
存储空间几何对象,通常存储WKT格式的空间数据
6、集群
H2支持两台服务器运行两个数据库成为集群,两个数据库互为备份,若是一个服务器失效,另外一个服务器仍然能够工做。另外只有服务模式支持集群配置。
H2能够经过CreateCluster工具建立集群,示例步骤以下(在在一台服务器上模拟两个数据库组成集群):
一、建立目录
建立两个服务器工做的目录
1
2
|
# mkdir server1
# mkdir server2
|
二、启动tcp服务
执行以下命令分别在910一、9102端口启动两个使用tcp服务模式的数据库
1
2
|
java org.h2.tools.Server-tcp -tcpPort
9101
-baseDir server1
java org.h2.tools.Server-tcp -tcpPort
9102
-baseDir server2
|
三、使用CreateCluster工具建立集群
1
2
3
4
5
|
java org.h2.tools.CreateCluster
-urlSource jdbc:h2:tcp:
//localhost:9101/~/test
-urlTarget jdbc:h2:tcp:
//localhost:9102/~/test
-user sa
-serverList localhost:
9101
,localhost:
9102
|
若是两个数据库不存在,该命令将会自动建立数据库。若是一个数据库失效,能够先删除坏的数据库文件,从新启动数据库,而后从新运行CreateCluster工具
四、链接数据库
如今可使用以下链接字符串链接集群数据库
1
|
jdbc:h2:tcp:
//localhost:9101,localhost:9102/~/test
|
五、监控集群运行状态
可使用以下命令查看配置的集群服务器是否都在运行
1
|
SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME=
'CLUSTER'
|
六、限制
H2的集群并不支持针对事务的负载均衡,因此不少操做会使两个数据库产生不一致的结果,执行以下操做时请当心:
1
|
RANDOM_UUID(), SECURE_RAND(), SESSION_ID(), MEMORY_FREE(), MEMORY_USED(), CSVREAD(), CSVWRITE(), RAND()
|
自动增加列和标识列不支持集群,当插入数据时,序列值须要手动建立
不支持SET AUTOCOMMIT FALSE语句,若是须要设置成为不自动提交,能够执行方法Connection.setAutoCommit(false)