第一次接触嵌入式数据库,不用额外搭建数据库就能存储数据,挺有意思的
H2 是标准 SQL 的关系型数据库,由 java 编写,整个 H2 是一个 jar 包(大约 2.5MB),其开源且使用 JDBC API 进行调用。其主要特性如下:
应用场景:
JDBC API:
JDBC(Java Database Connectivity)是 Java 连接各数据库的驱动,各数据库厂商负责实现。项目装上数据库对应的驱动,操作 JDBC 接口就能使用不同的数据库,避免了使用不同数据库就要学习不同数据库的方法
H2 支持嵌入、服务器、混合的运行模式,以及在内存或持久性的数据存储方式,还有兼容各类数据库
嵌入模式:应用程序和数据库在同一个 JVM 中,这是最快和最简单的连接模式。缺点是一个数据库在任何时候都只能在一个虚拟机(和类加载器)中打开
服务器模式:可理解为 C/S 模式,通过 TCP/IP 打开数据库,服务器模式比嵌入式模式慢。许多应用程序可以同时连接到同一个数据库,相当于独立部署了一个数据库服务器
混合模式:混合了嵌入式模式和服务器模式。第一个连接数据库的应用程序以嵌入式模式运行,其他应用程序可同时访问相同的数据
内存存储:意味着数据存储于内存之中,当关闭最后一个连接的时候内容即丢失,但可添加参数 DB_CLOSE_DELAY=-1,这样只要 JVM 还处于活动状态数据就不会丢失,这样也会导致内存泄漏
本地文件存储:一般包含两个文件 test.mv.db(所属库的所有表的事务日志、索引、数据)、test.trace.db(跟踪文件,包含跟踪信息)。这些文件可移动到另一个目录,也可以重命名(只要同一个数据库的所有文件都以相同的名称开头并且各自的扩展名不变)
各个数据库的引擎都有些不同,H2 支持 ANSI SQL 标准,并尝试与其他数据库兼容,但仍有一些差异(MySQL 文本默认不区分大小写,而 H2 是区分大小写的),H2 可模拟特定数据库的行为,但这种模仿是有限的,普通情况下可正常使用(下面举例 MySQL)
兼容 MySQL :
在数据库 URL 上添加参数 MODE=MySQL
<!-- jdbc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- 高版本不会自动创建库,连接前手动执行脚本 --> <!-- springboot 依赖也收录的 H2,可不写version --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.197</version> </dependency> <!-- mybatis-plus:封装了JDBC --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.1</version> </dependency>
spring: datasource: driver-class-name: org.h2.Driver # 数据库配置,建库,选项参数都在这 # ./持久化到本项目根目录 # mem:test 存放到内存中 url: jdbc:h2:./src/main/resources/database/test;IFEXISTS=FALSE username: root password: root h2: # 开启web控制台 console: enabled: true path: /h2-console settings: # 是否可远程访问 web-allow-others: true sql: # 初始化脚本 init: username: root password: root # 这 sql 脚本只对上面配置 url 里的库有效 mode: always schema-locations: classpath*:database/schema.sql data-locations: classpath*:database/data.sql
脚本放入 yml 文件里配置的地址:resources/database
# schema.sql CREATE TABLE IF NOT EXISTS `user` ( id BIGINT(20) NOT NULL COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT(11) NULL DEFAULT NULL COMMENT '年龄', email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (id) ); # data.sql INSERT INTO user (id, name, age, email) VALUES (1, 'Jone', 18, 'test1@baomidou.com'), (2, 'Jack', 20, 'test2@baomidou.com'), (3, 'Tom', 28, 'test3@baomidou.com'), (4, 'Sandy', 21, 'test4@baomidou.com'), (5, 'Billie', 24, 'test5@baomidou.com');
启动应用后查询,H2 支持 jdbc,mybatis 封装了 jdbc,也就是说 H2 也可以用 mybatis 来操作
// mybatis-plus 的使用方式 @Repository public interface UserMapper extends BaseMapper<User> { } // 直接地址映射获取结果 @RestController public class TestController { @Autowired UserMapper userMapper; @GetMapping("/list") public String list() { return userMapper.selectList(null).toString(); } } /** [ User(id=1, name=Jone, age=18, email=test1@baomidou.com), User(id=2, name=Jack, age=20, email=test2@baomidou.com), User(id=3, name=Tom, age=28, email=test3@baomidou.com), User(id=4, name=Sandy, age=21, email=test4@baomidou.com), User(id=5, name=Billie, age=24, email=test5@baomidou.com) ] */