Java 8 Friday Goodies:SQL ResultSet流

在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 ,现在我们觉得是时候开始一个新的博客系列了……

Java 8星期五

每个星期五,我们都会向您展示一些不错的教程风格的Java 8新功能,这些功能利用了lambda表达式,扩展方法和其他好东西。 您可以在GitHub上找到源代码 。

Java 8 Goodie:SQL ResultSet流

是的,必须再次处理SQL主题。 即使上周我们答应了关于并发性的文章 ,Java 8 lambda和与“传统” API的互操作性也是一个非常重要的方面,我们首先要谈一谈。

检查异常

是。 不幸的是,当我们使用Java 8的lambda表达式时,过去的那些野兽仍然困扰着我们。 在Java 8发行之前,已经有几个与此主题相关的Stack Overflow问题。

  • 标准Java 8功能接口的lambda表达式中的强制检查异常处理
  • 抛出异常的Lambda函数?
  • Lambda流,按方法进行异常过滤

让我们记住遍历文件系统时IOExceptions是如何引起问题的 。 除非您编写自己的实用程序,否则您将不得不诉诸此美:

Arrays.stream(dir.listFiles()).forEach(file -> {try {System.out.println(file.getCanonicalPath());}catch (IOException e) {throw new RuntimeException(e);}// Ouch, my fingers hurt! All this typing!
});

我们认为可以肯定地说:

Java 8和检查的异常不匹配。

一种解决方法是编写包装受检查异常的自己的CheckedConsumer 。 这样的使用者将具有很高的可重用性,但是……您是否想到了所有其他FunctionalInterfacesjava.util.function包中有很多它们:

java.util.function中的许多类型中的一些

java.util.function中的许多类型中的一些

jOOλ–在Java 8中修复lambda

jool-logo-黑色 在编写这个Java 8博客系列时 ,我们经常遇到需要在lambda表达式中包装检查异常的需求。 当我们经常遇到问题时,极客会怎么做? 我们修复它! 并且我们创建了jOOλ(也是jOOL,jOO-Lambda) , ASL 2.0许可的 ,在其中我们几乎复制了JDK可用的每个FunctionalInterface ,以支持受检查的异常。 在上面的示例中,使用jOOλ的方法如下:

Arrays.stream(dir.listFiles()).forEach(Unchecked.consumer(file -> {// Throw all sorts of checked exceptions// here, we don't care...System.out.println(file.getCanonicalPath());})
);

上面的示例显示了如何简单地忽略检查的异常并将其作为RuntimeExceptions传递。 如果您确实要处理它们,则可以传递一个异常处理程序lambda:

Arrays.stream(dir.listFiles()).forEach(Unchecked.consumer(file -> {System.out.println(file.getCanonicalPath());},e -> {log.info("Log stuff here", e);throw new MyRuntimeException(e);}
);

现在,第二个示例似乎同样冗长,但是不用担心。 您可能会重用该异常处理程序,然后回到此状态:

Arrays.stream(dir.listFiles()).forEach(Unchecked.consumer(file -> {System.out.println(file.getCanonicalPath());},myExceptionHandler
);

jOOλ–提供JDBC结果集流

不幸的是,Java 8 Streams API中的大多数工作都是在正确实现可并行化流的领域中进行的。 虽然这对于实际进行并行计算的人来说非常有用,但对于大多数其他人而言,与遗留API更好的集成会更好。 JDBC应该值得一提,它是JDBC,而我们之前已经对此进行过博客讨论 。 使用jOOλ ,您现在可以直接从ResultSets甚至从PreparedStatements生成流。 准备方法如下:

Class.forName("org.h2.Driver");
try (Connection c = getConnection()) {String sql = "select schema_name, is_default " +"from information_schema.schemata " +"order by schema_name";try (PreparedStatement stmt = c.prepareStatement(sql)) {// code here}
}

现在,使用jOOλ时要做的所有事情就是流这样的PreparedStatements

SQL.stream(stmt, Unchecked.function(rs ->new SQLGoodies.Schema(rs.getString("SCHEMA_NAME"),rs.getBoolean("IS_DEFAULT"))
))
.forEach(System.out::println);

其中SQLGoodies.Schema只是普通的POJO。 一些stream()方法的签名是这些签名:

public static <T> Stream<T> stream(PreparedStatement stmt,Function<ResultSet, T> rowFunction
);public static <T> Stream<T> stream(PreparedStatement stmt,Function<ResultSet, T> rowFunction,Consumer<? super SQLException> exceptionHandler
);

其他也可用。

太棒了,不是吗?

JDBC ResultSet应该是Java 8流。

不幸的是,上面的代码没有将其纳入JDK 8,因为这将是一次最终大大改善JDBC API的机会。 朱利安·埃森伯格(Julian Exenberger)在此进行了另一项类似的尝试来改善事物。

Java 8编写SQL的替代方法

我们还使用Java 8和SQL在此处发布了jOOλ的几种替代方法: http : //www.jooq.org/java-8-and-sql

结论

尽管Java 8的lambda表达式很棒,但是新的Streams API还是很不完整。 在实现上述内容时,我们必须实现自己的ResultSetIterator ,并将所有这些混乱情况写成将迭代器包装在Stream

StreamSupport.stream(Spliterators.spliteratorUnknownSize(new ResultSetIterator<>(supplier, rowFunction, exceptionTranslator), 0), false
);

如果只有我们能够生成有限的流 ,则不必首先编写Iterator

// Unfortunately, this method doesn't exist
Stream.generate(// Supplier, generating new POJOs() -> { rs.next(); return new SQLGoodies.Schema(rs.getString("SCHEMA_NAME"),rs.getBoolean("IS_DEFAULT"));},// Predicate, terminating the Stream() -> { !rs.isLast(); }
);

尽管jOOλ是一个可接受的中间解决方案,并且Guava家伙可能已经在研究如何修复其库,但这确实太糟糕了,因为Java 8缺少此类实用程序功能。

但是,我们在高度抱怨。 按照承诺,下周,我们将看到几个与并发相关的示例,请继续关注!

有关Java 8的更多信息

同时,请查看Eugen Paraschiv出色的Java 8资源页面

参考: Java 8 Friday Goodies:来自我们的JCG合作伙伴 Lukas Eder在Java,SQL和JOOQ博客上的SQL ResultSet流 。

翻译自: https://www.javacodegeeks.com/2014/03/java-8-friday-goodies-sql-resultset-streams.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud学习笔记(6)----Spring Cloud Netflix之负载均衡-Ribbon的使用

1. 什么是负载均衡&#xff1f; 负载均衡&#xff0c;就是分发请求流量到不同的服务器。 负载均衡一般分为两种 1. 服务器端负载均衡&#xff08;nginx&#xff09; 2. 客户端负载均衡&#xff08;Ribbon&#xff09; 2. 服务提供者&#xff08;spring-cloud-provider&#xff…

wait/notify实现线程间的通信

使线程之间进行通信之后&#xff0c;系统间的交互性更加强大&#xff0c;在大大提高CPU利用率的同时还会使程序对各线程任务在处理的过程中进行有效的把控与监督。 1.不使用wait/notify实现线程间通信 使用sleep()while(true)也可以实现线程间通信。 例如:两个线程&#xff0c…

洛谷 P3367 【模板】并查集

嗯... 题目链接&#xff1a;https://www.luogu.org/problemnew/show/P3367 并查集可以支持的操作&#xff1a;“并”和“查”。然后这道题主要就是考察这两种操作。将每一个点的“父亲”初始化为自己&#xff0c;然后分别进行“并”和“查”。 “并”&#xff1a;用递归函数fin…

jquery3和layui冲突导,致使用layui.layer.full弹出全屏iframe窗口时高度152px问题

项目中使用的jquery版本是jquery-3.2.1&#xff0c;在使用layui弹出全屏iframe窗口时&#xff0c;iframe窗口顶部总是出现一个152px高的滚动窗口无法实现真正全屏&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-…

ADF Faces。 立即的自定义客户端事件

在本文中&#xff0c;我将重点介绍ADF Faces Javascript API方法以从客户端触发自定义事件。 例如&#xff1a; function cliListener(actionEvent) {AdfCustomEvent.queue(actionEvent.getSource(), "servListener",null, true);}我们可以使用af&#xff1a;client…

Genymotion模拟器安装ARM架构编译应用失败解决方案

我们在安装一些应用到Genymotion模拟器会提示&#xff1a;adb: failed to install xx.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res-113] 原因是Genymotion采用的编译方式是x86&#xff0c;默认不支持ARM架构编译的应用&#xff0…

CentOS7.5 yum 安装与配置MySQL5.7.24

安装环境&#xff1a;CentOS7 64位 MINI版&#xff0c;安装MySQL5.7 1、配置YUM源 在MySQL官网中下载YUM源rpm安装包&#xff1a;https://dev.mysql.com/downloads/repo/yum/ 下面已经提供一个YUM源安装包,如果不需要特定版本可直接使用我提供的5.7.24版本 # 下载mysql源安装包…

5种改善服务器日志记录的技术

在最近的时间里&#xff0c;我们已经看到了许多工具可以帮助您理解日志。 诸如Scribe和LogStash之类的开源项目&#xff0c;诸如Splunk之类的本地工具以及诸如SumoLogic和PaperTrail之类的托管服务。 这些都可以帮助您将大量日志数据减少为更有意义的内容。 它们共有一个共同点…

java excel处理框架,Java三方—-excel框架之POI的使用一

Apache POI是Apache软件基金会的开放源码函式库&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。pdf框架之IText的使用&#xff0c;参见我的博客&#xff1a;Java三方—->pdf框架之IText的使用。今天我们开始POI中Excel部分的学习。POI框架的简单…

关于background-*的一些属性

1、盒模型 盒模型从外到内一次为&#xff1a;margin-box、border-box、padding-box、content-box。 2、一些属性设置的相对位置 ⑴background-position的属性值&#xff08;top/right/bottom/left/center&#xff09;起始位置是相对于padding-box外边沿开始的&#xff0c;…

Outlook邮件的右键菜单中添加自定义按钮

customUI代码如下&#xff1a; <customUI xmlns"http://schemas.microsoft.com/office/2009/07/customui"><contextMenus><contextMenu idMso"ContextMenuMailItem"> <button id"button1" label"修改件名"…

vue 项目的I18n国际化之路

I18n (internationalization ) ---未完善 产品国际化是产品后期维护及推广中重要的一环&#xff0c;通过国际化操作使得产品能更好适应不同语言和地区的需求 国际化重点&#xff1a;1、 语言语言本地化2、 文化颜色、习俗等3、 书写习惯日期格式、时区、数字格式、书写方向备…

使用IAM保护您的AWS基础架构

在开发新产品并发现合适的产品市场时&#xff0c;每个团队都需要快速行动。 尤其是初创公司&#xff0c;因为公司的整个未来都取决于快速找到为您的产品付款的人。 对于初创企业和其他团队来说&#xff0c; Amazon Web Services是令人难以置信的工具&#xff0c;可以快速构建其…

mysql文件软连接失败,解决打包软链接打包失败问题

一般情况下打包文件时&#xff0c;如果直接打包软连接会导致打包失败&#xff0c;即没有将要打包的内容打包进去&#xff0c;这里提供tar打包参数-h[rootlocalhost ~]# ll /etc/rc.locallrwxrwxrwx. 1 root root 13 Nov 24 00:45 /etc/rc.local -> rc.d/rc.local[rootlocalh…

快速掌握前端 专为Java程序员定制

Javascript 例子 修改页面内容 js 代码位置 <script>// js 代码 </script>引入 js 脚本 <script src"js脚本路径"></script>注意&#xff0c;到了框架之后&#xff0c;引入方式会有不同 1. 变量与数据类型 声明变量 1) let ⭐️ l…

Solidity中如何判断mapping中某个键是否为空呢?

Solidity中如何判断mapping中某个键是否为空呢&#xff1f; 一.比较标准的做法是建立一个专门和value相关的结构体&#xff0c;用一个布尔型变量来看是否这个key所对应的value被赋过值 代码如下&#xff1a; pragma solidity ^0.4.19;contract UserTest {struct User{string na…

mac安装了多版本php 卸载,mac 安装多版本PHP

前言相信大家在mac 安装PHP多版本的时候也遇到了很多坑# brew install php56# brew install php70这样安装的话肯定会报错的&#xff0c;因为brew存在软连接这个时候我们第一步&#xff1a;brew unlink php56 或者 brew unlink php70这个步骤是关闭掉PHP的软连接第二步&#x…

jQuery的on绑定click和直接绑定click区别

状况之外 在之前的公司并没有遇到这个问题&#xff0c;也就没有深究。直到自己换了现在的公司&#xff0c;刚来第二天就开始写别人写到一半的项目&#xff0c;很无奈&#xff0c;不是原生就是jquery&#xff0c;由于项目急&#xff0c;已经来不及切换框架重新布局&#xff0c;只…

Thymeleaf与Spring集成(第1部分)

1.引言 本文重点介绍如何将Thymeleaf与Spring框架集成。 这将使我们的MVC Web应用程序能够利用Thymeleaf HTML5模板引擎&#xff0c;而不会丢失任何Spring功能。 数据层使用Spring Data与mongoDB数据库进行交互。 该示例包含在酒店的单页Web应用程序中&#xff0c;从中我们可以…

oracle 老白,老白学编程 - Netdata学习 - numa

Numa 介绍NUMA,即Non-Uniform Memory Access Architecture&#xff0c;非统一内存访问架构。背景传统的SMP中&#xff0c; 所有处理器共享系统总线&#xff0c;当cpu数目增大时&#xff0c; 系统总现竞争就相应增加&#xff0c;会成为系统的瓶颈&#xff0c;所以SMP系统的CPU数…