Java 8 Friday:更多功能关系转换

过去,我们一直在每个星期五为您提供有关Java 8的新内容的新文章。这是一个非常令人兴奋的博客系列 ,但我们想再次将重点放在Java和SQL的核心内容上。 我们仍然偶尔会写关于Java 8的博客,但不再是每个星期五(有些人已经注意到)。

在Java 8 Friday系列的最后一篇简短文章中,我们要重申一个事实,我们相信未来属于功能性关系数据转换(与ORM相对) 。 我们使用面向对象的软件开发范例已经花费了大约20年的时间。 我们许多人对此非常教条。 然而,在过去的十年中,“新”范式已开始在编程社区中获得越来越多的关注: 函数式编程 。

但是,函数式编程并不是什么新鲜事物。 Lisp一直是非常早期的函数式编程语言。 XSLT和SQL也具有一定的功能(并且是声明性的!)。 由于我们是SQL功能(和声明性!)性质的忠实拥护者,我们为我们现在拥有Java中复杂的工具来转换从SQL数据库提取的表格数据而感到非常兴奋。 溪流!

SQL结果集与流非常相似

正如我们之前指出的那样, JDBC ResultSet和Java 8 Streams非常相似 。 当您使用jOOQ(使用org.jooq.Result替换JDBC ResultSet)时,情况org.jooq.Resultorg.jooq.Result扩展了java.util.List ,因此自动继承了所有Streams功能。 考虑以下查询,该查询允许获取BOOK和AUTHOR记录之间的一对多关系:

Map<Record2<String, String>, List<Record2<Integer, String>>> booksByAuthor =// This work is performed in the database
// --------------------------------------
ctx.select(BOOK.ID,BOOK.TITLE,AUTHOR.FIRST_NAME,AUTHOR.LAST_NAME).from(BOOK).join(AUTHOR).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID)).orderBy(BOOK.ID).fetch()// This work is performed in Java memory
// -------------------------------------.stream()// Group BOOKs by AUTHOR.collect(groupingBy(// This is the grouping key      r -> r.into(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME),// This is the target data structureLinkedHashMap::new,// This is the value to be produced for each// group: A list of BOOKmapping(r -> r.into(BOOK.ID, BOOK.TITLE),toList())));

对于习惯使用jOOQ编写SQL的人来说,Java 8 Streams API的流利性是非常习惯的。 显然,您还可以使用jOOQ以外的其他工具,例如Spring的JdbcTemplate或Apache Commons DbUtils,或仅将JDBC ResultSet包装在迭代器中……

与ORM相比,这种方法的优点是根本没有任何魔术发生。 每条映射逻辑都是明确的,而且由于使用Java泛型,因此完全是类型安全的。 在此示例中, booksByAuthor输出的类型很复杂,读/写有点困难,但它也具有充分的描述性和实用性。

与POJO相同的功能转换

如果您对使用jOOQ的Record2元组类型不太满意,那么没问题。 您可以这样指定自己的数据传输对象:

class Book {public int id;public String title;@Overridepublic String toString() { ... }@Overridepublic int hashCode() { ... }@Overridepublic boolean equals(Object obj) { ... }
}static class Author {public String firstName;public String lastName;@Overridepublic String toString() { ... }@Overridepublic int hashCode() { ... }@Overridepublic boolean equals(Object obj) { ... }
}

使用上述DTO,您现在可以利用jOOQ的内置POJO映射将jOOQ记录转换为您自己的域类:

Map<Author, List<Book>> booksByAuthor =
ctx.select(BOOK.ID,BOOK.TITLE,AUTHOR.FIRST_NAME,AUTHOR.LAST_NAME).from(BOOK).join(AUTHOR).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID)).orderBy(BOOK.ID).fetch().stream().collect(groupingBy(// This is the grouping key      r -> r.into(Author.class),LinkedHashMap::new,// This is the grouping value listmapping(r -> r.into(Book.class),toList())));

显性与隐性

在Data Geekery,我们相信Java开发人员的新时代已经开始。 一个时代,Annotatiomania™(最终!)结束了,人们不再通过注释魔术来承担所有隐性行为。 ORM依赖大量规范来解释每个注释如何与其他注释一起工作。 很难对JPA带给我们的这种不太了解的注释语言进行逆向工程(或调试!)。

在另一方面,SQL是很容易理解的。 表是一种易于处理的数据结构,如果您需要将这些表转换为更面向对象或更具层次结构的表,则可以简单地将函数应用于这些表并自己对值进行分组! 通过对这些值进行显式分组,您将完全控制映射,就像使用jOOQ一样,您将完全控制SQL。

这就是为什么我们认为,在未来5年中,ORM将失去相关性,人们将开始使用Java 8 Streams再次拥抱显式无状态 魔术的数据转换技术。

翻译自: https://www.javacodegeeks.com/2014/07/java-8-friday-more-functional-relational-transformation.html

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

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

相关文章

【WXS全局对象】Date

属性&#xff1a; 名称说明Date.parse( [dateString] )解析一个日期时间字符串&#xff0c;并返回 1970/1/1 午夜距离该日期时间的毫秒数。Date.UTC(year,month,day,hours,minutes,seconds,ms) 根据世界时返回 1970 年 1 月 1 日 到指定日期的毫秒数。 参数&#xff1a;year/m…

13个不可不知的ASP.NET MVC扩展点

ASP.NET MVC设计的主要原则之一是可扩展性。处理管线&#xff08;processing pipeline&#xff09;上的所有&#xff08;或大多数&#xff09;东西都是可替换的。因此&#xff0c;如果您不喜欢ASP.NET MVC所使用的约定&#xff08;或缺乏某些约定&#xff09;&#xff0c;您可以…

程序员常用的3大Web安全漏洞防御解决方案:XSS、CSRF及SQL注入(图文详解)

https://blog.csdn.net/ChenRui_yz/article/details/86489067 随着互联网的普及&#xff0c;网络安全变得越来越重要&#xff0c;程序员需要掌握最基本的web安全防范&#xff0c;下面列举一些常见的安全漏洞和对应的防御措施。01 常见的Web安全问题1.前端安全XSS 漏洞CSRF 漏洞…

在 HTML 中引入 vue.js 写页面

突然说要写两个页面&#xff08;只有两个页面&#xff0c;不是一个完整的项目。。&#xff09;&#xff0c;有点懵&#xff0c;不知道从哪下手&#xff0c;而且只对 vue 熟悉那么一丢丢&#xff0c;其他框架不是很熟悉。但是没办法鸭&#xff0c;只能硬着头皮去做了&#xff01…

JavaFX技巧14:StackPane子项-隐藏但不消失

另一个简短提示&#xff1a;Swing提供了一个名为CardLayout的布局管理器&#xff0c;该管理器管理容器内的一组组件&#xff08;卡&#xff09;&#xff0c;但始终仅显示其中一个。 方法CardLayout.show&#xff08;Container &#xff0c;String&#xff09;允许在组件/卡之间…

【WXS数据类型】Array

属性&#xff1a; 名称值类型说明[Array].constructor[String]返回值为“Array”,表示类型的结构字符串[Array].length[Number]返回数组长度 方法&#xff1a; 原型&#xff1a;[Array].toString() 说明&#xff1a;将数组转换成字符串&#xff0c;用逗号分隔每个元素 原型&am…

Mschart图表制作

首先一次安装这三个 &#xff08;1&#xff09;.Microsoft .NET Framework 3.5 的 Microsoft 图表控件 &#xff08;2&#xff09;.Microsoft .NET Framework 3.5 语言包的 Microsoft 图表控件 &#xff08;3&#xff09;.Microsoft Chart Controls Add-on for Microsoft Visua…

vue打包后,font格式错误

本地测试没有问题&#xff0c;项目打包以后&#xff0c;浏览器打开控制台&#xff0c;提示font格式错误&#xff1a; 把我的双引号给去掉了。。。-^- 不开心。 解决办法&#xff1a; 1. 把 font: 字体粗细 字体大小/行高 "字体样式"; 分开来写。 改成&#xff1a;…

获取可用密码算法的列表

您如何学习可用的密码算法&#xff1f; Java规范列出了几种必需的密码&#xff0c;摘要等&#xff0c;但是提供程序通常提供的不止这些。 幸运的是&#xff0c;这很容易了解我们系统上的可用内容。 public class ListAlgorithms {public static void main(String[] args) {//…

【...】小程序扩展运算符 ... 说明

小程序扩展运算符 ... &#xff0c;用来将一个对象展开。 以下示例&#xff1a; 1 <template is"objectCombine" data"{{...obj1, ...obj2, e: 5}}"></template> 1 Page({2 data: {3 obj1: {4 a: 1,5 b: 26 },7 o…

fhq_treap || BZOJ 3224: Tyvj 1728 普通平衡树 || Luogu P3369 【模板】普通平衡树

题面&#xff1a;【模板】普通平衡树 代码&#xff1a; 1 #include<cstdio>2 #include<cstring>3 #include<iostream>4 #include<cstdlib>5 using namespace std;6 inline int rd(){7 int x0,f1;char cgetchar();8 while(c<0||c>9){if(c…

关于Zend framework 里一段代码的疑问

初学框架 看了一些代码 有一些疑问 在此记录 1 publicfunction__isset($key)2 {3 returnthis->_engine->get_temlate_vars($key)!null;4 }我想这个函数返回的一定是一个bool值 但不知道get_temlate_vars($key)!null 这里面的!是怎么个用法 希望有知道的能告诉我一声 谢谢…

html笔记(四)弹性盒+响应式

大标题小节一、弹性盒1. 标准盒模型和怪异盒模型2. 弹性盒dipalay3. 与display配合使用的其他属性4. 弹性盒的对齐方式5. 弹性盒的默认特性二、响应式布局1. 媒体查询2. 怎样使用媒体查询3. 优缺点以及使用场景4. Meta 标签的定义5. 常见的属性操作三、多列布局四、移动端布局1…

【app.json】配置说明,不断更新中

app.json文件用来对微信小程序进行全局配置&#xff0c;决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。 注意&#xff1a; 1) json配置中键名、键值必须使用双引号&#xff0c;不能使用单引号。 2) 以下配置中除了page字段是必需设置&#xff0c;其它项目…

使用Java泛型的模板方法模式示例

如果发现除了某些部分外&#xff0c;您的许多例程完全相同&#xff0c;那么您可能需要考虑使用Template Method来消除容易出错的代码重复 。 这是一个示例&#xff1a;下面是两个做类似事情的类&#xff1a; 实例化并初始化Reader以从CSV文件读取。 阅读每一行并将其分解为令…

golang 使用错误总结

以下是平时一些总结&#xff0c;伙伴们如发现有误或者更好解决方案/其他一些问题一起分享出来&#xff0c;互相学习&#xff0c;共同进步 1 win下编译linux golang 可执行文件 &#xff0c;服务器上无法运行 几种问题定位&#xff1a; 1 查看服务器报错日志定位 2 查看web服务器…

享受Android应用程序的Java技术盛宴

Java™ 语言是 Android 开发人员所选的工具。Android 运行时使用自己的虚拟机Dalvik&#xff0c;这并不是多数程序开发人员使用的普通Java 虚拟机。Dalvik支持Java 编程语言的大部分功能——但并不是全部。在本文中&#xff0c;您将学习高级Java功能及其如何在Android中实现。这…

echarts地图在ie浏览器上不显示

前面是安装及上手教程&#xff0c;参考了彩色泡泡 和 winne雪 的博客。 如果已经写好了&#xff0c;可以直接跳到 问题总结。 1. npm install echarts --save 2. 在 main.js 中 import echarts from echarts; Vue.prototype.$echarts echarts;3. 在页面上 import china fr…

字符串反转

<script> var mystring我是王大昭啊! mystringmystring.split().reverse().join() alert(mystring); </script> 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

虚拟主机上快速安装kail

官方文档的筛选 【1】Kali Linux是什么? Kali Linux是一个高级渗透测试和安全审计Linux发行版. Kali Linux 特性 Kali是BackTrack Linux完全遵循Debian开发标准的完整重建.全新的目录框架、复查并打包所有工具、还为VCS建立了Git 树. 超过300个渗透测试工具: 复查了BackTrack里…