1. 前言
前面讲一些 Mybatis 特性的时候总是要写一些例子演示给粉丝。用 Mysql 或者其他很大的数据库太重了,因为只是个 demo 而已。当然也可以使用 docker 来安装。但是还是需要依赖一些东西。有没有非常小巧而且便于携带的数据库,而且能满足很小场景的数据库。当然有。今天介绍一种纯 java 编写而且支持 jdbc 的嵌入式关系型数据库 H2。
2. 数据库 H2
H2 数据库的特点:
- 非常快,开源,支持 JDBC API
- 嵌入式和服务器模式;内存数据库
- 基于浏览器的控制台应用程序
- 占用空间小,jar 只有 2MB 大小
以上只是官网列出的特点。其实还有跨平台的优势,支持目前常见的大部分平台。还兼容常见的主流关系型数据库,比如 DB2、Oracle、MS SQL Server、Mysql、PostgreSQL、HSQLDB、Ignite、Derby 等。
3. 使用场景
基于以上的特点。H2 数据库特别适用于快速构建的小型应用。尤其在应用开发中和单元测试中使用非常方便,而且节省系统资源。而且 springboot 的依赖池也收录了 H2 数据库。接下来我们通过 springboot 结合 Mybatis 来对 H2 数据库进行一些特性的讲解演示。
4.springboot 中使用 H2
springboot 使用 H2 数据库非常简单。集成 BOM 下的 H2 依赖就可以了。这里为了演示我们还引入了 Mybatis。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
当然引入依赖还不够我们还需要对其他参数进行配置。当然这些配置可以通过 springboot 的 application.yml(application.properties)来完成。我们知道 H2 支持像 tomcat 一样内嵌到 springboot 应用中,也支持独立的 server 进程模式。通过不同的配置我们来演示一下。
5. 内嵌模式
内嵌模式,就是把在应用中引入 H2,启动应用的同时,会把 H2 数据服务也启动,应用中既包含了 H2 数据库的服务端,同时应用又作为客户端来连接 H2 数据库。
5.1 内存模式连接
内存模式就是数据库文件存在于内存中,没有持久化,当应用进程关闭时数据库与数据表会消失。为了独立环境,我们利用 springboot 的 profile 特性来隔离不同模式的环境配置。我们定制一个名称为 application-inner.yml 来测试内嵌模式。配置如下:
spring:
datasource:
# 驱动
driver-class-name: org.h2.Driver
# h2 内存数据库 内存模式连接配置 库名: mybatis
url: jdbc:h2:mem:mybatis
# 初始化数据表 DDL
schema: classpath:sql/init.sql
# 初始化数据 DML
data: classpath:sql/data.sql
h2:
# 开启 console 访问 默认 false
console:
enabled: true
settings:
# 开启 h2 console 跟踪 方便调试 默认 false
trace: true
# 允许 console 远程访问 默认 false
web-allow-others: true
# h2 访问路径上下文
path: /h2-console
# 日志
logging:
level:
cn:
felord: debug
# mybatis 配置
mybatis:
mapper-locations: classpath:mapper/*.xml
configuration:
map-underscore-to-camel-case: true
type-aliases-package: cn.felord.mybatis.entity
type-handlers-package: cn.felord.mybatis.type
springboot 项目 通过指定 –spring.profiles.active=inner 启动后,输入 http://localhost:8080/h2-console,进入 H2 数据的控制台
一定要注意红框按照你配置文件中的 spring.datasource.url 来设置,不要用默认值。如果没有设置密码直接点 connect,设置密码了输入。进入下列界面:
因为我们在初始化指定了 DDL、DML SQL 脚本,创建了 student 表,而且插入了 3 条数据。所以会呈现出来。证明集成成功。同时我们执行 maven 工程的测试包也会成功完成 Mybatis 单元测试。但是我们关闭应用后数据会丢失因为这些数据存在于内存中。内存是会被回收的。不信你注释掉 spring.datasource.schema 或者 spring.datasource.data 重启看看。那么如何持久化呢?这就用到嵌入模式了。
5.2 嵌入模式连接
嵌入模式就是数据库文件存在于应用当前的硬盘内,进行了持久化,当应用进程关闭时数据库与数据表不会消失。我们只需要将 5.1 的 yml 配置中的 spring.datasource.url 改为 jdbc:h2:file:E:/H2/mybatis。然后启动重新登录 console。注意 url 要改为 jdbc:h2:file:E:/H2/mybatis 哦。发现数据都在,然后我们关闭再启动发现报错了:
说明数据库中的数据冲突了。我们注释掉 DDL、DML 初始化发现又能启动了。证明数据持久化了。url 中 file: 后缀你系统的可用路径,H2 就能把数据持久化到该路径下。
5.3 兼容性
开始我们提到 H2 可以兼容很多数据库。如何兼容呢?通过 url 后缀 MODE 参数来设置,总结一下自己使用:
- Oracle jdbc:h2:~/test;MODE=Oracle 或 SQL 语句 SET MODE Oracle
- Mysql jdbc:h2:~/test;MODE=MySQL;DATABASE_TO_LOWER=TRUE
- PostgreSQL jdbc:h2:~/test;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE
- MS SQL Server jdbc:h2:~/test;MODE=MSSQLServer 或 SQL 语句 SET MODE MSSQLServer
其他不一一列举,但是注意兼容也不是完全兼容,会有一些注意事项和微小的差别。一般不会出现问题。进一步了解可查阅官方文档和其他资料。
总结
今天介绍了 H2 这种小巧而灵活方便的数据库。介绍了 H2 的一些特性并和 springboot、mybatis 这些框架结合起来进行开发和单元测试。后面还介绍了它的兼容性配置。目的就是为了方便大家在数据库相关的 java 开发中快速的进行搭建开发或者测试环境。希望以上的介绍能帮助到你。多多关注我,有问题可以私信。该项目 demo 已经托管到码云:https://gitee.com/felord/myba… 切换到 h2 分支。
关注公众号:Felordcn 或者 https://felord.cn 获取更多资讯