文章目录

  • 简介
  • H2数据库简介
  • r2dbc-h2
  • r2dbc-h2的Maven依赖
  • 建立连接
  • 参数绑定
  • 批处理
  • 事务和Savepoint

简介

本文将会介绍R2DBC的H2实现r2dbc-h2的使用方法和要注意的事项。一起来看看吧。

H2数据库简介

什么是H2数据库呢?

H2是一个Java SQL database,它是一个开源的数据库,运行起来非常快。

H2流行的原因是它既可以当做一个独立的服务器,也可以以一个嵌套的服务运行,并且支持纯内存形式运行。

H2的jar包非常小,只有2M大小,所以非常适合做嵌套式数据库。

如果作为嵌入式数据库,则需要将h2*.jar添加到classpath中。

下面是一个简单的建立H2连接的代码:

import java.sql.*;
public class Test {public static void main(String[] a)throws Exception {Connection conn = DriverManager.getConnection("jdbc:h2:~/test", "sa", "");// add application code hereconn.close();}
}

如果给定地址的数据库并不存在,

同时H2还提供了一个简单的管理界面,使用下面的命令就可以启动H2管理界面:

java -jar h2*.jar

默认情况下访问http://localhost:8082就可以访问到管理界面:

r2dbc-h2

r2dbc-h2是r2dbc spi的一种实现。同样的使用r2dbc-h2也提供了两种h2的模式,一种是文件系统,一种是内存。

同时还提供了事务支持,prepared statements和batch statements等特性的支持。

r2dbc-h2的Maven依赖

要想使用r2dbc-h2,我们需要添加如下依赖:

<dependency><groupId>io.r2dbc</groupId><artifactId>r2dbc-h2</artifactId><version>${version}</version>
</dependency>

如果你体验snapshot版本,可以添加下面的依赖:

<dependency><groupId>io.r2dbc</groupId><artifactId>r2dbc-h2</artifactId><version>${version}.BUILD-SNAPSHOT</version>
</dependency><repository><id>spring-libs-snapshot</id><name>Spring Snapshot Repository</name><url>https://repo.spring.io/libs-snapshot</url>
</repository>

建立连接

h2有两种连接方式,file和内存,我们分别看一下都是怎么建立连接的:

ConnectionFactory connectionFactory = ConnectionFactories.get("r2dbc:h2:mem:///testdb");Publisher<? extends Connection> connectionPublisher = connectionFactory.create();
ConnectionFactory connectionFactory = ConnectionFactories.get("r2dbc:h2:file//my/relative/path");Publisher<? extends Connection> connectionPublisher = connectionFactory.create();

我们还可以通过ConnectionFactoryOptions来创建更加详细的连接信息:

ConnectionFactoryOptions options = builder().option(DRIVER, "h2").option(PROTOCOL, "...")  // file, mem.option(HOST, "…").option(USER, "…").option(PASSWORD, "…").option(DATABASE, "…").build();ConnectionFactory connectionFactory = ConnectionFactories.get(options);Publisher<? extends Connection> connectionPublisher = connectionFactory.create();// Alternative: Creating a Mono using Project Reactor
Mono<Connection> connectionMono = Mono.from(connectionFactory.create());

上面的例子中,我们使用到了driver,protocol, host,username,password和database这几个选项,除此之外H2ConnectionOption中定义了其他可以使用的Option:

public enum H2ConnectionOption {/*** FILE|SOCKET|NO*/FILE_LOCK,/*** TRUE|FALSE*/IFEXISTS,/*** Seconds to stay open or {@literal -1} to to keep in-memory DB open as long as the virtual machine is alive.*/DB_CLOSE_DELAY,/*** TRUE|FALSE*/DB_CLOSE_ON_EXIT,/*** DML or DDL commands on startup, use "\\;" to chain multiple commands*/INIT,/*** 0..3 (0=OFF, 1=ERROR, 2=INFO, 3=DEBUG)*/TRACE_LEVEL_FILE,/***  Megabytes (to override the 16mb default, e.g. 64)*/TRACE_MAX_FILE_SIZE,/*** 0..3 (0=OFF, 1=ERROR, 2=INFO, 3=DEBUG)*/TRACE_LEVEL_SYSTEM_OUT,LOG,/*** TRUE|FALSE*/IGNORE_UNKNOWN_SETTINGS,/*** r|rw|rws|rwd (r=read, rw=read/write)*/ACCESS_MODE_DATA,/*** DB2|Derby|HSQLDB|MSSQLServer|MySQL|Oracle|PostgreSQL|Ignite*/MODE,/***  TRUE|FALSE*/AUTO_SERVER,/*** A port number*/AUTO_SERVER_PORT,/*** Bytes (e.g. 512)*/PAGE_SIZE,/*** Number of threads (e.g. 4)*/MULTI_THREADED,/*** TQ|SOFT_LRU*/CACHE_TYPE,/*** TRUE|FALSE*/PASSWORD_HASH;
}

当然还有最直接的database选项:

r2dbc:h2:file//../relative/file/name
r2dbc:h2:file///absolute/file/name
r2dbc:h2:mem:///testdb

我们还可以通过H2特有的代码H2ConnectionFactory来创建:

H2ConnectionFactory connectionFactory = new H2ConnectionFactory(H2ConnectionConfiguration.builder().inMemory("...").option(H2ConnectionOption.DB_CLOSE_DELAY, "-1").build());Mono<Connection> connection = connectionFactory.create();
CloseableConnectionFactory connectionFactory = H2ConnectionFactory.inMemory("testdb");Mono<Connection> connection = connectionFactory.create();

参数绑定

在使用prepare statement的时候,我们需要进行参数绑定:

connection.createStatement("INSERT INTO person (id, first_name, last_name) VALUES ($1, $2, $3)").bind("$1", 1).bind("$2", "Walter").bind("$3", "White").execute()

除了$符号绑定之外,还支持index绑定,如下所示:

Statement statement = connection.createStatement("SELECT title FROM books WHERE author = $1 and publisher = $2");
statement.bind(0, "John Doe");
statement.bind(1, "Happy Books LLC");

批处理

我们来看下r2dbc-h2是怎么来进行批处理的:

Batch batch = connection.createBatch();
Publisher<? extends Result> publisher = batch.add("SELECT title, author FROM books").add("INSERT INTO books VALUES('John Doe', 'HappyBooks LLC')").execute();

事务和Savepoint

r2dbc还支持事务和savepoint,我们可以在事务中rollback到特定的savepoint。具体的代码如下:

Publisher<Void> begin = connection.beginTransaction();Publisher<Void> insert1 = connection.createStatement("INSERT INTO books VALUES ('John Doe')").execute();Publisher<Void> savepoint = connection.createSavepoint("savepoint");Publisher<Void> insert2 = connection.createStatement("INSERT INTO books VALUES ('Jane Doe')").execute();Publisher<Void> partialRollback = connection.rollbackTransactionToSavepoint("savepoint");Publisher<Void> commit = connection.commit();

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/r2dbc-h2-in-depth/

本文来源:flydean的博客

欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

深入理解h2和r2dbc-h2相关推荐

  1. h2数据库学习----h2数据库基本使用

    依赖 <dependency><groupId>org.glassfish.hk2</groupId><artifactId>hk2</artif ...

  2. h2数据库学习------h2数据库介绍

    介绍 H2是一款内存数据库,适合我们在开发阶段.学习阶段调试代码使用,并不适用于生产阶段,可以满足我们学习与调试代码的需求. H2 数据库是一个用 Java 开发的嵌入式(内存级别)数据库,它本身只是 ...

  3. java h2 derby_嵌入式H2数据库的Spring配置以进行测试

    小编典典 由于我不知道是否有任何工具可以检查数据库,我认为一个简单的解决方案是使用支持HSQL,H2和Derby 的Spring嵌入式数据库(3.1.x docs,current docs). . 使 ...

  4. H2.64和H2.65编码区别

    H2.64编码码流: H2.65编码码流: 1.概述 H2.64/H2.65码流的组成形式: 序列(GOP),图像(I帧,p帧等),片组(slice group),片(slice),宏块(macrob ...

  5. Spring Boot + BeetlSQL + H2数据库项目整合

    Spring Boot + BeetlSQL + H2数据库项目整合 这个项目是一个大佬给的,目的是看我的自学能力和基础知识的牢固程度,要求如下: 底层架构采用springboot 前端技术使用lay ...

  6. h1、h2、h3标签及strong标签对页面seo的影响

    今天和大家来聊下h1,h2,h3,strong几个标签,在网页中的使用对页面seo的影响,也阐述了个人的一些想法. 首先简要讲下H标签及strong标签的含义:<h1>.<h2> ...

  7. java h2数据库_JAVA 项目中使用 H2 数据库

    JAVA 项目中使用 H2 数据库 发布时间:2018-06-08 15:43, 浏览次数:823 , 标签: JAVA 为什么要使用H2数据库 H2数据库是可以嵌入到JAVA项目中的,因为只需要导入 ...

  8. 通过ingress连自己MySQL_把H2数据库从jar包部署到Kubernetes,并解决Ingress不支持TCP的问题...

    1 前言 H2 Database是一个优秀的数据库,又小又方便,支持内存和文件形式,经常会在测试.POC(proof of concept)或开发环境用到它.在Springboot的许多应用中,也是内 ...

  9. spring_通过Spring Boot了解H2 InMemory数据库

    spring 介绍 基本上,数据库设置涉及几个步骤,然后才能在应用程序中通过已配置的数据源使用它. 实际上,这在实际项目实施中是必需的. 但是,在某些情况下,我们只需要为某件事完成POC,并且整个数据 ...

最新文章

  1. AI一分钟 | 传阿里百度京东6月回归A股;汽车合资股比限制将取消,特斯拉或成最大赢家...
  2. Linux_学习_01_常用命令大全
  3. 疫情期间在公共场所要全程佩戴口罩,不要抱有侥幸心理
  4. 【Java】 5.6 类的继承
  5. Unlock SAP Data
  6. 【bzoj2555】Substring【后缀平衡树入门】
  7. Node.js -- Stream 使用小例 ( 流运用 :读取、写入、写出、拷贝)
  8. 医学专用计算机证,问一下,医学生考计算机2级证和心理咨询师证有用吗
  9. 原 Spring RestTemplate中几种常见的请求方式
  10. InstallShield 教程
  11. html 发送ping帧,HTML5:ping属性之死亡ping与隐私追踪
  12. smartdrv.exe 文件说明
  13. 医疗行业某集团公司财务系统迁移阿里云的案例分享
  14. 利用 Maxima 求解常微分方程
  15. 还不了解游戏建模教程吗?看完这篇文章让你从小白变为油条
  16. iOS 获取照相机实时预览图片
  17. WEBGUI中上一页(PgUp/Page Up)和下一页(PgDn/Page Down)键不起效
  18. SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.21 SpringBoot 整合 ActiveMQ
  19. 用js获取某一年一共多少天和剩余天数
  20. 63. 不同路径 II【动态规划】

热门文章

  1. PyTorch-训练
  2. Spaly_Tree 模版
  3. 18.self关键字.rs
  4. 20.IDA-修改二进制文件、显示修改点
  5. SQLServer附加数据库提示“版本为661,无法打开,支持655版本……”
  6. 标准STUN判断NAT类型的过程及改进
  7. python selenium 鼠标移动到指定元素,并点击对应的元素
  8. 万字整理,图解Linux内存管理所有知识点
  9. Kafka科普系列 | 什么是LSO?
  10. 腾讯----小Q的歌单