过去,我们一直在每个星期五为您提供有关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

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

  1. java 1.8新增功能_睡觉时:新增的Java 8新增功能

    java 1.8新增功能 自Java 8推出以来,最有趣的功能是什么? Java 8最近庆祝了它的第一个生日,其主要版本已经在一年多以前了. 这当然值得庆祝. 自从最初的Java 8版本问世以来,已经 ...

  2. java 基础包的功能_Java 8的功能基础

    java 基础包的功能 Java 8彻底改变了Java. 它很可能是过去10年中最重要的Java版本. 有很多新功能,包括默认方法,方法和构造函数引用以及lambda, 仅举几例 . 更有趣的功能之一 ...

  3. Java 8中的功能接口是什么? @功能注释和示例

    函数接口是Java 8最重要的概念之一,实际上为lambda表达式提供了动力,但是许多开发人员没有首先了解函数接口在Java 8中的作用就花了很多精力来理解它,并花时间学习lambda表达式和Stre ...

  4. java 文档比较功能_Java 12 新特性介绍,快来补一补

    Java 12 早在 2019 年 3 月 19 日发布,它不是一个长久支持(LTS)版本.在这之前我们已经介绍过其他版本的新特性,如果需要可以点击下面的链接进行阅读. Switch 表达式 (JEP ...

  5. 《AngularJS深度剖析与最佳实践》一1.5 实现更多功能:主题

    本节书摘来自华章出版社<AngularJS深度剖析与最佳实践>一书中的第1章,第1.5节,作者 雪狼 破狼 彭洪伟,更多章节内容可以访问云栖社区"华章计算机"公众号查看 ...

  6. java to csharp_Java To CSharp源代码转换

    导读热词 前言 开发环境 客户端:Unity3D开发(C#) 服务器:Java (基于Java7) 日   期:2016年09月 需求说明 部分服务器的部分逻辑功能在客户端实现一遍,可以简单的理解为服 ...

  7. java发布后功能不能用,急项目发布后java写的打印功能失效了-求解解决方法

    当前位置:我的异常网» J2EE » 急项目发布后java写的打印功能失效了-求解解决方法 急项目发布后java写的打印功能失效了-求解解决方法 www.myexceptions.net  网友分享于 ...

  8. java 实现网络通信_利用Java怎么样实现网络通信功能

    利用Java怎么样实现网络通信功能 发布时间:2020-11-20 15:19:04 来源:亿速云 阅读:72 作者:Leah 利用Java怎么样实现网络通信功能?相信很多没有经验的人对此束手无策,为 ...

  9. java中类与类的关系_Java中类与类的关系

    在java中类和类的关系大致分三种:泛化.关联.依赖. 1. 泛化(Generalization) "XX是一个XX"关系(is a),通常使用的关键词为 extends.impl ...

最新文章

  1. redis灵魂拷问:如何使用stream实现消息队列
  2. base64图片保存获取本地路径
  3. 怎么用计算机算p a,老师,(P/A,12%,10)这个值用计算器怎么算出来?
  4. 解决一个输入框可输入多个条件进行查询时,后端该怎么接收参数以及SQL语句如何写
  5. linux+广播程序,Linux系统下广播程序制作介绍(上) (3)
  6. javascript操作表格案例讲解
  7. Pandas 通用方法
  8. Opencv中的图像深、浅拷贝
  9. 3.nginx 的基本配置与优化
  10. 自己动手编写一个VS插件(三)——创建工具栏之一
  11. 竣达技术丨24路电压电流采集模块
  12. CF 1728 D. Letter Picking 区间dp 1800
  13. openslide read region 出现黑块 解决办法
  14. python窗口界面自适应_自适应页面的实现方式
  15. android如何拨打电话
  16. c语言printf使用方法,C/C++语言printf命令使用方法
  17. PTA 7-63 黑白子交换棋局
  18. tar -zxvf xxx.tar,gz --Linux中解压语句-zxvf的含义
  19. shell脚本触发企业微信群机器人
  20. Microsoft Office PPT 编程(VBA)学习 (不定时更新,正在学习 ing)

热门文章

  1. React中判断已完成的个数
  2. Android build.gradle(app)介绍
  3. SecureCRT连接Linux的操作步骤
  4. Java Poi 向excel中插入图片
  5. 日期相减 python_如果将excel的数字转化为日期(高级教程)
  6. java7和java8切换_切换表达式到Java吗?
  7. java设计模式教程_Java设计模式教程
  8. java 拼图_我最喜欢的Java拼图2 + 1 = 4
  9. 香草 jboss 工具_如何为JBoss Developer Studio 8设置BPM和规则工具
  10. u3d ab包 循环依赖_为什么要保持软件包依赖项自由循环的五个原因