www.baeldung.com/rxjava-jdbc
作者:baeldung
译者:oopsguy.com

1、概述

简单地说,rxjava-jdbc 是一个用于与关系数据库交互的 API,其允许以链式的方式调用。在此快速教程中,我们将来了解这个类库,以及如何使用它的一些常用功能。

在阅读本教程之前,你需要有一定的 RxJava 基础知识。

2、Maven 依赖

从 Maven 依赖开始,我们需要把依赖添加到 pom.xml 文件中:

<dependency><groupId>com.github.davidmoten</groupId><artifactId>rxjava-jdbc</artifactId><version>0.7.11</version>
</dependency>复制代码

我们可以在 Maven Central 上找到最新版本的 API。

3、主要组件

Database 类是运行所有常见类型数据库交互的主入口点。要创建一个 Database 对象,我们可以将 ConnectionProvider 接口实现实例传递给 from() 静态方法:

public static ConnectionProvider connectionProvider= new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD);
Database db = Database.from(connectionProvider);复制代码

ConnectionProvider 有几个值得注意的实现 — 例如 ConnectionProviderFromContextConnectionProviderFromDataSourceConnectionProviderFromUrlConnectionProviderPooled

为了做些基本操作,我们可以使用以下 Database 的 API:

  • select() — 用于 SQL select 查询
  • update() — 用于 DDL 语句,如 create 和 drop,以及 insert、update 和 delete

4、启动

在下面的快速示例中,我们将展示基本的数据库操作:

public class BasicQueryTypesTest {Observable<Integer> create,insert1, insert2, insert3, update, delete = null;@Testpublic void whenCreateTableAndInsertRecords_thenCorrect() {create = db.update("CREATE TABLE IF NOT EXISTS EMPLOYEE("+ "id int primary key, name varchar(255))").count();insert1 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(1, 'John')").dependsOn(create).count();update = db.update("UPDATE EMPLOYEE SET name = 'Alan' WHERE id = 1").dependsOn(create).count();insert2 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(2, 'Sarah')").dependsOn(create).count();insert3 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(3, 'Mike')").dependsOn(create).count();delete = db.update("DELETE FROM EMPLOYEE WHERE id = 2").dependsOn(create).count();List<String> names = db.select("select name from EMPLOYEE where id < ?").parameter(3).dependsOn(create).dependsOn(insert1).dependsOn(insert2).dependsOn(insert3).dependsOn(update).dependsOn(delete).getAs(String.class).toList().toBlocking().single();assertEquals(Arrays.asList("Alan"), names);}
}复制代码

这里有一点需要注意 — 我们调用 dependsOn() 来决定查询的运行顺序。

否则,代码将失败或产生不可预测的结果,除非我们以一定的顺序指定要执行的查询。

5、自动映射

自动映射功能允许我们将指定的数据库记录映射到对象。

我们来看看两种数据库记录的自动映射方法。

5.1、使用接口自动映射

我们可以使用带注解的接口将数据库记录 automap() 到对象。为此,我们可以创建一个带注解的接口:

public interface Employee {@Column("id")int id();@Column("name")String name();}复制代码

之后,运行测试:

@Test
public void whenSelectFromTableAndAutomap_thenCorrect() {List<Employee> employees = db.select("select id, name from EMPLOYEE").dependsOn(create).dependsOn(insert1).dependsOn(insert2).autoMap(Employee.class).toList().toBlocking().single();assertThat(employees.get(0).id()).isEqualTo(1);assertThat(employees.get(0).name()).isEqualTo("Alan");assertThat(employees.get(1).id()).isEqualTo(2);assertThat(employees.get(1).name()).isEqualTo("Sarah");
}复制代码

5.2、使用类自动映射

我们还可以使用具体的类来将数据库记录自动映射到对象。让我们看看该类的写法:

public class Manager {private int id;private String name;// standard constructors, getters, and setters
}复制代码

运行测试:

@Test
public void whenSelectManagersAndAutomap_thenCorrect() {List<Manager> managers = db.select("select id, name from MANAGER").dependsOn(create).dependsOn(insert1).dependsOn(insert2).autoMap(Manager.class).toList().toBlocking().single();assertThat(managers.get(0).getId()).isEqualTo(1);assertThat(managers.get(0).getName()).isEqualTo("Alan");assertThat(managers.get(1).getId()).isEqualTo(2);assertThat(managers.get(1).getName()).isEqualTo("Sarah");
}复制代码

这里有几个要点:

  • createinsert1insert2 引用了在创建 Manager 表并将记录插入其中返回的 Observables
  • 我们查询中所 select 的列的数量必须与 Manager 类构造方法中的参数数量相匹配
  • 列必须是可以自动映射到构造方法中的类型

有关自动映射的更多信息,请访问 GitHub 上的 rxjava-jdbc 仓库

6、使用大对象

API 支持使用大对象(如 CLOB 和 BLOBS)。在接下来的小节中,我们将介绍如何利用这一功能。

6.1、CLOB

我们来如何 insert 和 select 一个 CLOB:

@Before
public void setup() throws IOException {create = db.update("CREATE TABLE IF NOT EXISTS " + "SERVERLOG (id int primary key, document CLOB)").count();InputStream actualInputStream= new FileInputStream("src/test/resources/actual_clob");actualDocument = getStringFromInputStream(actualInputStream);InputStream expectedInputStream = new FileInputStream("src/test/resources/expected_clob");expectedDocument = getStringFromInputStream(expectedInputStream);insert = db.update("insert into SERVERLOG(id,document) values(?,?)").parameter(1).parameter(Database.toSentinelIfNull(actualDocument)).dependsOn(create).count();
}@Test
public void whenSelectCLOB_thenCorrect() throws IOException {db.select("select document from SERVERLOG where id = 1").dependsOn(create).dependsOn(insert).getAs(String.class).toList().toBlocking().single();assertEquals(expectedDocument, actualDocument);
}复制代码

请注意,getStringFromInputStream() 是将 InputStream 的内容转换为 String

6.2、BLOB

我们可以使用 API 以类似的方式使用 BLOB。唯一的区别是,我们不必传递一个 StringtoSentinelIfNull() 方法,而是传递一个字节数组。

我们可以这样做:

@Before
public void setup() throws IOException {create = db.update("CREATE TABLE IF NOT EXISTS "+ "SERVERLOG (id int primary key, document BLOB)").count();InputStream actualInputStream= new FileInputStream("src/test/resources/actual_clob");actualDocument = getStringFromInputStream(actualInputStream);byte[] bytes = this.actualDocument.getBytes(StandardCharsets.UTF_8);InputStream expectedInputStream = new FileInputStream("src/test/resources/expected_clob");expectedDocument = getStringFromInputStream(expectedInputStream);insert = db.update("insert into SERVERLOG(id,document) values(?,?)").parameter(1).parameter(Database.toSentinelIfNull(bytes)).dependsOn(create).count();
}复制代码

之后,我们可以在之前的例子中服用同样的测试。

7、事务

接下来,我们来看看事务支持。

事务管理允许我们处理在单个事务中分组多个数据库操作的事务,以便它们都能被提交 — 永久保存到数据库中,或者完全回滚。

我们来看一个快速示例:

@Test
public void whenCommitTransaction_thenRecordUpdated() {Observable<Boolean> begin = db.beginTransaction();Observable<Integer> createStatement = db.update("CREATE TABLE IF NOT EXISTS EMPLOYEE(id int primary key, name varchar(255))").dependsOn(begin).count();Observable<Integer> insertStatement = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(1, 'John')").dependsOn(createStatement).count();Observable<Integer> updateStatement = db.update("UPDATE EMPLOYEE SET name = 'Tom' WHERE id = 1").dependsOn(insertStatement).count();Observable<Boolean> commit = db.commit(updateStatement);String name = db.select("select name from EMPLOYEE WHERE id = 1").dependsOn(commit).getAs(String.class).toBlocking().single();assertEquals("Tom", name);
}复制代码

我们调用 beginTransaction() 方法来开始一个事务。调用此方法后,每个数据库操作都将在同一个事务中运行,直到调用 commit()rollback() 方法为止。

我们可以使用 rollback() 方法捕获 Exception 来回滚整个事务,以防代码由于某些原因而失败。我们可以为所有 Exception 或指定 Exception 进行此操作。

8、返回生成的 key

如果我们在处理的表中设置了 auto_increment 字段,我们可能需要检索生成的值。我们可以通过调用 returnGeneratedKeys() 方法来实现。

我们来看一个快速示例:

@Test
public void whenInsertAndReturnGeneratedKey_thenCorrect() {Integer key = db.update("INSERT INTO EMPLOYEE(name) VALUES('John')").dependsOn(createStatement).returnGeneratedKeys().getAs(Integer.class).count().toBlocking().single();assertThat(key).isEqualTo(1);
}复制代码

9、结论

在本教程中,我们了解了如何使用 rxjava-jdbc 的链式方法。我们还介绍了它提供的一些常用功能,例如自动化、使用大对象和事务。

您可以在 GitHub 上获取完整的代码。

相关链接和原文代码

  • github.com/eugenp/tuto…

[译] RxJava JDBC 简介相关推荐

  1. DriverManager 驱动管理器类简介 JDBC简介(三)

    驱动程序管理器是负责管理驱动程序的,驱动注册以后,会保存在DriverManager中的已注册列表中 后续的处理就可以对这个列表进行操作 简言之,驱动管理器,就是字面含义,主要负责就是管理 驱动 概述 ...

  2. JDBC—01—JDBC简介;JDBC常用接口与类;

    一. JDBC 简介 1 什么是 JDBC JDBC(Java DataBase Connectivity)java 数据库连接 是 JavaEE 平台下的技术规范 定义了在 Java 语言中连接数据 ...

  3. JDBC与ORM发展与联系 JDBC简介(九)

    概念回顾 回顾下JDBC的概念: JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它 ...

  4. [译]机器人操作系统简介:终极机器人应用框架(上)

    2019独角兽企业重金招聘Python工程师标准>>> [译]机器人操作系统简介:终极机器人应用框架 /*** 原文出处:https://www.toptal.com/robotic ...

  5. Data Source与数据库连接池简介 JDBC简介(八)

    DataSource是作为DriverManager的替代品而推出的,DataSource 对象是获取连接的首选方法. 起源 为何放弃DriverManager DriverManager负责管理驱动 ...

  6. [译] RxJava 中的错误处理

    本文讲的是[译] RxJava 中的错误处理, 原文地址:Error handling in RxJava 原文作者:Dmitry Ryadnenko 译文出自:掘金翻译计划 本文永久链接:githu ...

  7. JDBC简介及原理和使用介绍

    JDBC简介及原理和使用介绍 JDBC简介 jdbc概述 ​ Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据 ...

  8. 深圳Java培训:JDBC简介

    深圳Java培训:JDBC简介 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一 ...

  9. JDBC第一回——JDBC简介、JDBC原理图、JDBC快速入门、JDBC API(DriverManager、Connection、Statement)详解

    文章目录 JDBC JDBC简介 JDBC原理图 JDBC快速入门 JDBC API详解 DriverManager Connection Statement JDBC JDBC简介 JDBC概念 J ...

最新文章

  1. 与猜数问题有关的游戏C语言,猜数字游戏(C语言版)
  2. UVA11437 Triangle Fun(相似三角形,做辅助线求解相似比例)
  3. 公众号python训练营真的假的_python中的这些坑,早看早避免。
  4. Nginx 性能优化
  5. 四叶草社交平台——十天冲刺(10)
  6. mysql负变量_MySQL的变量
  7. java保留两位小数怎么_java保留两位小数4种方法
  8. java spark 教程_Spark基础教程——向Spark传递函数(Java篇)
  9. xp大容量u盘补丁_大容量硬盘补丁
  10. EPUB电子书阅读必备
  11. 英语动名词可以做什么句子成分
  12. mumu模拟器cpu设置_网易MuMu模拟器CPU虚拟化怎么设置?
  13. flutter源码下载(最新)
  14. nohup命令解决SpringBoot/java -jar命令启动项目运行一段时间自动停止问题
  15. N76E003AT20筋膜枪单片机设计方案
  16. 灾备系统与备用服务器区别,服务器灾备方案是什么
  17. Altium Designer--如何隐藏连线
  18. 解决最新版discuz安装模板插件提示“对不起,您安装的不是正版应用”
  19. php设计模式:单例模式
  20. Cloudberry Drive的神用法

热门文章

  1. idea 这么还原debug_看源码,我为什么推荐IDEA ?
  2. 引入mysql+命名空间_C#连接MySQL操作详细教程
  3. 用python赚零花钱_用Python拓展副业的几种方式
  4. 【图像分割应用】医学图像分割(一)——脑区域分割
  5. 中国香皂行业产量份额预测与消费需求商机研究报告2022年
  6. 中国电子用LCP树脂市场未来发展展望及十四五规划咨询建议报告2022-2028年版
  7. 中国互联网+政务建设发展现状及市场规模预测报告2022-2027年版
  8. 全球及中国液氦低温恒温器行业竞争调查分析及前景预测报告2021-2027年版
  9. 滁州布局创新链服务链~农业大健康·万祥军:谋定功能性农业
  10. 微软2019暑期实习笔试题