Java 8 Friday Goodies:Lambda和SQL

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

Java 8星期五

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

Java 8 Goodie:Lambda和SQL

如果您习惯于编写Groovy,这对您来说可能是“ so 2003”。 我们知道。 自成立以来,Groovy便知道一种非常有用的方式来编写基于字符串的SQL。 这是用Groovy编写的示例( 请参阅此处的官方文档 ):

import groovy.sql.Sql
sql = Sql.newInstance( 'jdbc:h2:~/test', 'sa', '', 'org.h2.Driver' )
sql.eachRow( 'select * from information_schema.schemata' 
) { println "$it.SCHEMA_NAME -- $it.IS_DEFAULT" 
}

还要注意Groovy的内置String插值,您可以在其中将表达式放入字符串中。 但是,如果我们使用的是第三方库而不是直接使用JDBC,那么我们在Java领域,并且在Java 8中,Java / SQL集成也会变得更好。

在以下示例中,我们正在研究如何使用这三个流行的库从H2数据库中获取数据并将记录映射到自定义POJO / DTO中:

  • OO (震惊,我知道)
  • Spring数据/ JDBC
  • Apache Commons DbUtils

与往常一样, 这些资源也可以从GitHub获得 。 对于这些测试,我们将创建一些POJO / DTO来包装模式元信息:

class Schema {final String schemaName;final boolean isDefault;Schema(String schemaName, boolean isDefault) {this.schemaName = schemaName;this.isDefault = isDefault;}@Overridepublic String toString() {return "Schema{" +"schemaName='" + schemaName + '\'' +", isDefault=" + isDefault +'}';}
}

我们的主要方法将通过DriverManager获得H2连接:

Class.forName("org.h2.Driver");
try (Connection c = getConnection("jdbc:h2:~/test", "sa", "")) {String sql = "select schema_name, is_default "+"from information_schema.schemata "+"order by schema_name";// Library code here...
}

现在,当使用基于字符串的SQL时,Java 8如何改进jOOQ API? 太好了! 查看以下小查询:

DSL.using(c).fetch(sql).map(r -> new Schema(r.getValue("SCHEMA_NAME", String.class),r.getValue("IS_DEFAULT", boolean.class))).forEach(System.out::println);

这应该是这样,对吗? 请注意,jOOQ的本机API还能够将数据库Record直接映射到您的POJO上,例如:

DSL.using(c).fetch(sql).into(Schema.class).forEach(System.out::println);

使用Spring JDBC和RowMapper时,事情看起来同样不错(请注意,以下内容仍会引发已检查的SQLException ):

new JdbcTemplate(new SingleConnectionDataSource(c, true)).query(sql, (rs, rowNum) -> new Schema(rs.getString("SCHEMA_NAME"),rs.getBoolean("IS_DEFAULT"))).forEach(System.out::println);

…如果您使用的是Apache DbUtils ,则可以执行几乎相同的操作:

new QueryRunner().query(c, sql, new ArrayListHandler()).stream().map(array -> new Schema((String) array[0],(Boolean) array[1])).forEach(System.out::println);

结论

这三种解决方案或多或少都是等效的,并且非常精简。 同样,这里的要点是Java 8将改进所有现有的API。 接受SAM参数(单一抽象方法类型)的方法越明确(很少重载!),对于Java 8集成越好。

下周,我们将看到使用java.util.Map API时将大大改善的几件事。

参考: Java 8 Friday Goodies:来自Java,CG和JOOQ博客的JCG合作伙伴 Lukas Eder的Lambda和SQL 。

翻译自: https://www.javacodegeeks.com/2014/02/java-8-friday-goodies-lambdas-and-sql.html

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

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

相关文章

酷毙了!三种风格的全屏幻灯片效果【附源码下载】

今天,我们想向您展示如何创建平铺背景图像的幻灯片效果。其灵感来自于国外的一个工作室网站(围观),这个网站充满了各种有趣和创意效果,一定记得去看看。 这个幻灯片效果是由四个区域的独立移动构成,通过画面…

VMware卸载有残留,再安装时报错提示MSI Failed

引用自吾爱破解论坛:https://www.52pojie.cn/thread-455779-1-1.html 解决方法:软件自动清理法; 软件 地址:下载地址1:链接:http://pan.baidu.com/s/1ntzAR7j 密码:a8ug备用:http://…

基本函数依赖和候选键_[总结]关系数据库设计基础(函数依赖、无损连接性、保持函数依赖、范式、……)...

联系(Relationship)1:1联系:如果实体集E1中的每个实体最多只能和实体集E2中一个实体有联系,反之亦然,那么实体集E1对E2的联系成为一对一联系,记为1:1;1:N联系:一对多,记为1&#xff…

使用Mockito模拟自动装配的字段

依赖注入是诸如Spring和EJB之类的Control容器反转的非常强大的功能。 将注入的值封装到私有字段中总是一个好主意。 但是,自动连线字段的封装会降低可测试性。 我喜欢Mockito解决此问题以模拟自动装配字段的方式。 将在示例中进行解释。 (此博客文章希望…

西游之路——python全栈——CRM项目之表结构设计

一、表结构设计 1 from django.db import models2 from django.contrib.auth.models import User3 4 """自带验证"""5 class UserProFile(models.Model):6 """用户信息表"""7 user models.OneToOneField…

你见过吗?9款超炫的复选框(Checkbox)效果

复选框(Checkbox)在各个浏览器中的效果不一致,因此很多 Web 开发人员会自己重新设计一套界面和使用体验都更佳的复选框功能。下面就给大家分享9款超炫的复选框(Checkbox)效果,纯 CSS3 实现,未使…

系统制成docker镜像_docker镜像原理 镜像制作 dockerfile

为什么一个centos镜像只有两百多兆,而tomcat镜像五百多兆1.先说说操作系统操作系统组成部分:进程调度子系统进程通信子系统内存管理子系统设备管理子系统文件管理子系统网络通信子系统作业控制子系统Linux文件系统由bootfs和rootfs两部分组成bootfs&…

linux的vi命令详解,Linux上Vi命令详解

Linux下Vi命令详解补充一点:在vi中使用命令的方法是:冒号命令回车,如:q 回车代表退出。这里有一本0分下载关于Vi详细介绍的书:http://download.csdn.net/detail/zqiang_55/4399731文本编辑器是所有计算机系统中最常用的一种工具。…

jpg、gif、png-8、png-24的区别

一、gif格式的特点 1、透明性。gif是一种布尔透明类型,即它可以是全透明,也可以是全不透明,但是没有半透明 2、动画。gif支持动画 3、无损耗性。gif是一种无损耗的图像格式,这意味着你可以对gif图片做任何操作也不会使图片质量产生…

Java依赖注入选项

我想花一些时间来总结一些流行的Java依赖注入(DI)框架。 这是可用功能的高级概述。 首先,什么是依赖注入? “依赖注入是一种软件设计模式,可以删除硬编码的依赖,并可以在运行时或编译时更改它们。” – 维…

实用技巧:使用 Google Analytics 跟踪 JS 错误

Google Analytics(谷歌分析)不仅仅是一个流量统计工具,你还可以用它来测量广告活动的有效性,跟踪用户多远到所需的页面流(从点击广告到购物车到结账页面)获取,并基于用户的信息设置浏览器和语言…

从Ubuntu 14.04 LTS版升级到Ubuntu 16.04 LTS

Ubuntu 16.04 (Xerial Xerus) Long Term Support版于最近发布了。要想了解它的新功能和新特性,就必须升级或安装这个新系统。 本文讲述怎样一步步从Ubuntu 14.04 LTS版升级到Ubuntu 16.04 LTS版。要注意在升级前做好重要数据的备份,以免造成数据损失。因…

finditerable 转list_java – 通过拆分和运行将ListenableFuture转换为Iterable

(替代my original answer)但是,如果转型是缓慢的,或者某些输入可能会失败但是对其他输入成功会怎么样?在这种情况下,我们希望单独转换每个输出.另外,我们希望确保转换只发生一次.我们的集合转换方法不能保证这一点.因此,在您的示例代码中,输出上的每次迭代都会向执行…

linux 的date命令详解,linux之date命令详解

时间方面 :% : 印出% %n : 下一行%t : 跳格%H : 小时(00..23)%I : 小时(01..12)%k : 小时(0..23)%l : 小时(1..12)%M : 分钟(00..59)%p : 显示本地 AM 或 PM%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止…

Java 8:对集合中的值进行排序

意识到Java 8将在接下来的几周内发布其GA版本之后,我认为现在是时候来看看它了,在过去的一周里,我一直在阅读Venkat Subramaniam的书 。 我要讲的是第3章,其中涉及对人员集合进行排序。 Person类的定义大致如下: sta…

html的table弹窗_Js弹出基于Table的可关闭浮动层

可以拖动和隐藏的层,替代弹出窗口isIEdocument.all;isNN!document.all&&document.getElementById;isN4document.layers;isHotfalse;function ddInit(e){topDogisIE ? "BODY" : "HTML";whichDogisIE ? document.all.theLayer : docume…

Linux装ntfs后内存不够,Linux_安装Ubuntu后无法使用NTFS硬盘或移动硬盘,  在安装Ubuntu系统后,存在 - phpStudy...

安装Ubuntu后无法使用NTFS硬盘或移动硬盘在安装Ubuntu系统后,存在无法使用NTFS硬盘或移动硬盘的问题,下面小编就给大家介绍下Ubuntu系统无法挂载NTFS的解决方法,不知如何挂载的朋友不妨来了解下。具体问题如下图所示:“Please res…

TJOI2018Party

题目描述 小豆参加了\(NOI\)的游园会,会场上每完成一个项目就会获得一个奖章,奖章 只会是\(N\), \(O\), \(I\)的字样。在会场上他收集到了\(K\)个奖章组成的串。 兑奖规则是奖章串和兑奖串的最长公共子序列长度为小豆最后奖励的等级。 现在已知兑奖串长度…

HTML5 Dashboard – 那些让你激动的 Web 技术

HTML5 Dashboard 是一个 Mozilla 推出的项目,里面展示了最前沿的 HTML5,CSS3,JavaScript 技术。每一项技术都有简洁,在线演示以及详细的文档链接。这些技术将成为未来一段时间 Web 开发的顶尖技术,如果不想落伍的话就赶…

通过自动回复机器人学Mybatis---基础版

第1章 案例简介 介绍要实现的案例情况,后面会通过这个案例来学习 Mybatis第2章 实战第一部----黎明前的黑暗 在没有 Mybatis 的情况下,使用 Jsp Servlet Jdbc 实现案例中的一个模块开发流程1: 开发流程2: 开发流程3:…