H2 数据库

安装

  1. 官网下载压缩包
  2. 解压到任意目录
  3. 进入 h2/bin 目录,运行 java -jar h2*.jar

h2 数据库启动后,会自动使用默认浏览器打开管理页面 http://localhost:8082

使用 H2 控制台

登录界面

  • 选择 “Generic H2 (Embedded)” 配置
  • JDBC URL 输入 jdbc:h2:~/db_name;,其它 ~/db_name 对应用户目录下的 db_name 文件
  • 用户名默认为 sa
  • 密码可以为空

点击连接后,进入到管理界面

管理界面

管理页面按钮不多,每个按钮的作用,可以将鼠标悬浮到上面,查看 tooltip

导入导出数据库

导入数据库

通过命令行

1
2
3
java -cp h2*.jar org.h2.tools.Script -url jdbc:h2:~/zhp1 -user sa -script zahuopu.sql
# 使用压缩文件
java -cp h2*.jar org.h2.tools.Script -url jdbc:h2:~/config -user sa -script test.zip -options compression zip

通过控制台

1
RUNSCRIPT FROM 'test.sql'

导出数据库

通过命令行

1
2
3
java -cp h2*.jar org.h2.tools.Script -url jdbc:h2:~/config -user sa -script zahuopu.sql
# 导出压缩文件
java -cp h2*.jar org.h2.tools.Script -url jdbc:h2:~/config -user sa -script test.zip -options compression zip

通过控制台

1
SCRIPT 'test.sql'

springboot 单元测试中使用

1 放置文件

将 schema.sql 和 data.sql 放置在 src/test/resources/db/ 目录

2 修改配置

打开 application-test.yml,添加 h2 数据库配置

1
2
3
4
5
6
7
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:zhp_test;mode=mysql;
username: root
schema: classpath:db/schema.sql
data: classpath:db/data.sql

H2 的一些配置

mode=mysql

以 mysql 方式运行,对于从 mysql 导出的脚本,会提供很好的兼容性。使用方式有两种:

  • 加到 url 中:url: jdbc:h2:mem:zhp_test;mode=mysql;
  • 加到 sql 脚本开头:SET MODE MYSQL;

REFERENTIAL_INTEGRITY

关闭 REFERENTIAL_INTEGRITY,可以让脚本忽略外键约束,比如插入数据时。加在脚本中的做法是SET REFERENTIAL_INTEGRITY FALSE;

MySQL 脚本转换 H2 脚本

直接导出的 MySQL 脚本,并不能直接用于 H2 数据库,存在语法兼容问题。比如这里所列。

常用导出方法

mysqldump

1
2
3
4
# 只导出表结构
mysqldump --no-create-info -h localhost -u root -p jizhunmall_test > ~/zhp_20180925_data.sql
# 只导出数据
mysqldump -d -h localhost -u root -p jizhunmall_test > ~/zhp_20180925_tables.sql

phpmyadmin

phpmyadmin 有非常好用的 UI,可以通过配置规则导出,比如:

  • 不包含符号 `
  • 不包含注释

导出后,比较简单的做法是用正则表达式替换,下面列出了一些:

1 替换注释

  • COMMENT '[^']+?' 替换为空
  • COMMENT='[^']+?' 替换为空

2 替换 charset

  • CHARACTER SET utf8 COLLATE utf8_bin 替换为空
  • COLLATE utf8_unicode_ci 替换为空
  • COLLATE=utf8_unicode_ci 替换为空

3 替换数据类型

  • float( 替换为 decimal(
  • double( 替换为 decimal(

4 一次性修改表变为多条

2层

1
2
^(ALTER TABLE .+)\n(  ADD .+),\n(  ADD .+;)
$1\n$2;\n$1\n$3

3层

1
2
^(ALTER TABLE .+)\n(  ADD .+),\n(  ADD .+),\n(  ADD .+;)
$1\n$2;\n$1\n$3;\n$1\n$4

4层

1
2
^(ALTER TABLE .+)\n(  ADD .+),\n(  ADD .+),\n(  ADD .+),\n(  ADD .+;)
$1\n$2;\n$1\n$3;\n$1\n$4;\n$1\n$5

5层

1
2
^(ALTER TABLE .+)\n(  ADD .+),\n(  ADD .+),\n(  ADD .+),\n(  ADD .+),\n(  ADD .+;)
$1\n$2;\n$1\n$3;\n$1\n$4;\n$1\n$5;\n$1\n$6