第一次接触嵌入式数据库,不用额外搭建数据库就能存储数据,挺有意思的
1. H2
H2 是标准 SQL 的关系型数据库,由 java 编写,整个 H2 是一个 jar 包(大约 2.5MB),其开源且使用 JDBC API 进行调用。其主要特性如下:
- 非常快,开源,JDBC API
- 嵌入式和服务器模式;可基于内存的数据库
- 事务支持,多版本并发,全文搜索,可加密数据库
- 基于浏览器的控制台应用程序
- 占用空间小:大约 2.5 MB jar 文件大小
- ODBC 驱动程序(语言无关的驱动,JDBC 只与 Java 关联)
应用场景:
- 快速构建小型应用(数据库和内嵌式项目一起打包,方便存储少量的结构化数据)
- 单元测试使用(快速构建数据库,内存模式数据用完清空还原)
JDBC API:
JDBC(Java Database Connectivity)是 Java 连接各数据库的驱动,各数据库厂商负责实现。项目装上数据库对应的驱动,操作 JDBC 接口就能使用不同的数据库,避免了使用不同数据库就要学习不同数据库的方法
2. 模式、存储与兼容
H2 支持嵌入、服务器、混合的运行模式,以及在内存或持久性的数据存储方式,还有兼容各类数据库
2.1 模式
嵌入模式:应用程序和数据库在同一个 JVM 中,这是最快和最简单的连接模式。缺点是一个数据库在任何时候都只能在一个虚拟机(和类加载器)中打开
服务器模式:可理解为 C/S 模式,通过 TCP/IP 打开数据库,服务器模式比嵌入式模式慢。许多应用程序可以同时连接到同一个数据库,相当于独立部署了一个数据库服务器
混合模式:混合了嵌入式模式和服务器模式。第一个连接数据库的应用程序以嵌入式模式运行,其他应用程序可同时访问相同的数据
2.2 存储
内存存储:意味着数据存储于内存之中,当关闭最后一个连接的时候内容即丢失,但可添加参数 DB_CLOSE_DELAY=-1,这样只要 JVM 还处于活动状态数据就不会丢失,这样也会导致内存泄漏
本地文件存储:一般包含两个文件 test.mv.db(所属库的所有表的事务日志、索引、数据)、test.trace.db(跟踪文件,包含跟踪信息)。这些文件可移动到另一个目录,也可以重命名(只要同一个数据库的所有文件都以相同的名称开头并且各自的扩展名不变)
2.3 兼容模式
各个数据库的引擎都有些不同,H2 支持 ANSI SQL 标准,并尝试与其他数据库兼容,但仍有一些差异(MySQL 文本默认不区分大小写,而 H2 是区分大小写的),H2 可模拟特定数据库的行为,但这种模仿是有限的,普通情况下可正常使用(下面举例 MySQL)
兼容 MySQL :
在数据库 URL 上添加参数 MODE=MySQL
- 将浮点数转换为整数时,小数位不会被截断,但值会四舍五入。
- 在 INSERT 语句中支持 ON DUPLICATE KEY UPDATE
- 部分支持 INSERT IGNORE,如果未指定 ON DUPLICATE KEY UPDATE,则可用于跳过具有重复键的行
- 部分支持 REPLACE INTO
- 允许 DISTINCT 查询的 ORDER BY 子句中不相关的表达式
- 支持 LIMIT / OFFSET 子句
- 可以使用 AUTO_INCREMENT 子句
- 允许数值和布尔值之间的不安全比较运算符
- …………
3. SpringBoot 使用示例
3.1 添加依赖
<!-- 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>
3.2 yml 配置
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
3.3 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');
3.4 查询
启动应用后查询,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)
]
*/
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/273178.html