成为Java流大师–第4部分:数据库流

SQL一直是一种声明性语言,而Java长期以来势在必行。 Java流改变了游戏规则。 通过本动手文章编写您的方式,并学习如何使用Java流对RDBMS数据库执行声明性查询,而无需编写任何SQL代码。 您会发现,Java流和SQL命令的动词之间有着惊人的相似性。

本文是五分之四 ,另外还有一个GitHub存储库,其中包含每个单元的说明和练习。

第1部分:创建流 第2部分:中级操作 第三部分:终端操作 第4部分:数据库流 第5部分:使用流创建数据库应用程序

当您熟悉Streams的操作时,您可能已经注意到与SQL构造的相似之处。 它们中的一些或多或少直接映射到Stream操作,例如LIMITCOUNT 。 开源项目Speedment利用这种相似性,使用纯Java提供对任何关系数据库的类型安全访问。

下表显示了Speedment如何在SQL流与Java流之间进行映射。

我们是Speedment开源项目的贡献者,我们将描述Speedment如何允许我们使用数据库作为流源,并使用来自任何数据库表的行向管道馈送数据。

如上图所示,Speedment将建立与数据库的连接,然后可以将数据传递给应用程序。 不需要为数据库条目编写任何代码,因为Speedment会分析基础数据库并自动生成域模型所需的所有实体类。 当您不必为要使用的每个表手动编写和维护实体类时,它可以节省大量时间。

Sakila数据库

为了本文和练习的方便,我们使用MySQL示例数据库Sakila作为我们的数据源。 Sakila数据库为老式电影租赁业务建模,因此包含诸如Film和Actor之类的表。 数据库实例已部署在云中,并且可以公开访问。

速度管理器

在Speedment中,数据库表的句柄称为
Manager 。 管理器是自动生成的代码的一部分。

Manager充当数据库表的句柄,并且可以充当流源。 在这种情况下,每一行都对应一个Film实例。

通过调用以下内容来实例化“加速Manager

 FilmManager films = speedment.getOrThrow(FilmManager. class ); 

注意:speedment是可以从ApplicationBuilder获得的实例(下一篇文章中有关此主题的更多信息)。

如果调用了FilmManager::stream ,则结果是一个Stream ,我们可以自由地对其应用任何中间或终端操作。 首先,我们将收集列表中的所有行。

 List<Film> allFilms = films.stream().collect(toList()); 
 FilmImpl { filmId = 1 , title = ACADEMY DINOSAUR, …  FilmImpl { filmId = 2 , title = ACE GOLDFINGER, …  FilmImpl { filmId = 3 , title = ADAPTATION HOLES, … FilmImpl { filmId = , title = ADAPTATION HOLES, …  … 

过滤和计数

让我们看一个简单的示例,该示例输出评级为“ PG-13”的电影数量。 就像常规Stream ,我们可以过滤出具有正确评分的电影,然后对这些条目进行计数。

 long pg13FilmCount = films.stream() .filter(Film.RATING.equal( "PG-13" )) .count(); 
 pg13FilmCount: 195 

Speedment自定义实现Streams后的一个重要属性是,流能够通过自省来优化自己的管道。 看起来Stream会遍历表的所有行,但事实并非如此。 相反,Speedment能够将管道转换为传递给数据库的优化SQL查询。 这意味着仅将相关的数据库条目提取到流中。 因此,在上面的示例中,类似于“ SELECT…FROM film WHERE rating ='PG-13'”,流将自动呈现为SQL。

这种自省要求将匿名lambda的任何使用(不包含与目标列相关的任何元数据)替换为Speedment Fields中的谓词。 在这种情况下, Film.RATING.equal(“PG-13”)返回一个Predicate ,该Predicate将在每个Film上进行测试,并且仅当该Film的评级为PG-13时才返回true。

虽然,这并不妨碍我们将谓词表示为:

 .filter(f -> f.getRating().equals(“PG- 13 ”)) 

但这将迫使Speedment提取表中的所有行,然后应用谓词,因此建议这样做。

寻找最长的电影

这是一个使用max-operator和Field Film.LENGTH查找数据库中最长的电影的Field Film.LENGTH

 Optional<Film> longestFilm = films.stream() .max(Film.LENGTH); 
 longestFilm:  Optional[FilmImpl {filmId = 141 , title = CHICAGO NORTH, length = 185 , ...}] 

寻找三部短片

找到三部短片(我们定义为短于<= 50分钟)可以通过过滤掉50分钟或更短的任何片并挑选出前三个结果来完成。 该示例中的谓词查看“长度”列的值,并确定该值是否小于或等于50。

 List<Film> threeShortFilms = films.stream() .filter(Film.LENGTH.lessOrEqual( 50 )) .limit( 3 ) .collect(toList()); 
 threeShortFilms: [ FilmImpl { filmId = 2 , length = 48 ,..}, FilmImpl { filmId = 3 , length = 50 , … }, FilmImpl { filmId = 15 , length = 46 , ...}] 

分页分页

如果要在网站或应用程序中显示所有电影,我们可能希望对项目进行分页,而不是一次(可能)加载数千个条目。 这可以通过结合操作skip()和limit() 。 在下面的示例中,我们收集第二页的内容,假设每个“页面”包含25个条目。 回想一下,Streams不能保证元素的特定顺序,这意味着我们需要使用sorted-operator定义一个顺序才能使其按预期工作。

 List<Film> filmsSortedByLengthPage2 = films.stream() .sorted(Film.LENGTH) .skip( 25 * 1 ) .limit( 25 ) .collect(toList()); 
 filmsSortedByLengthPage2:  [FilmImpl { filmId = 430 , length = 49 , …}, …] 

注意:查找第n页的内容是通过跳过(25 *(n-1))完成的。

注意2:此流将自动呈现为“ SELECT…FROM film ORDER BY length ASC LIMIT?”。 OFFSET?,值:[25,25]”

以“ A”开头的电影,按长度排序

我们可以轻松地找到任何以大写字母“ A”开头的电影,并根据其长度(以最短的电影为首)对它们进行排序,如下所示:

 List<Film> filmsTitleStartsWithA = films.stream() .filter(Film.TITLE.startsWith( "A" )) .sorted(Film.LENGTH) .collect(Collectors.toList()); 
 filmsTitleStartsWithA: [ FilmImpl { filmId= 15 , title=ALIEN CENTER, …, rating=NC- 17 , length = 46 , FilmImpl { filmId= 2 , title=ACE GOLDFINGER, …, rating=G, length = 48 ,  … ] 

计算胶片长度的频率表

我们还可以利用groupingBy运算符根据其长度对存储桶中的胶片进行排序,并计算每个存储桶中的胶片总数。 这将创建一个所谓的胶片长度频率表。

 Map<Short, Long> frequencyTableOfLength = films.stream() .collect(Collectors.groupingBy( Film.LENGTH.asShort(), counting() )); 
 frequencyTableOfLength: { 46 = 5 , 47 = 7 , 48 = 11 , 49 = 5 , … } 

练习题

对于本周的练习,您无需担心连接自己的数据库。 相反,我们已经提供了到云中Sakila数据库实例的连接。 像往常一样,这些练习可以在此GitHub存储库中找到。 本文的内容足以解决名为MyUnit4Database的第四个单元。 相应的
Unit4Database接口包含JavaDocs,它们描述MyUnit4Database方法的预期实现。

 public interface Unit4Database { /** * Returns the total number of films in the database. * * @param films manager of film entities * @return the total number of films in the database */ long countAllFilms(FilmManager films); 


提供的测试(例如Unit4MyDatabaseTests )将充当自动评分工具,让您知道您的解决方案是否正确。

下一篇

到目前为止,我们仅涉及数据库流的内容。 下一篇文章将允许您使用纯Java编写独立的数据库应用程序。 编码愉快!

s

Per Minborg

Julia·古斯塔夫森(Julia Gustafsson)

资源资源

GitHub开源项目加速

Speedment Stream ORM 初始化程序
GitHub存储库“ hol-streams”
文章第1部分:创建流 第2部分:中级操作 第3部分:终端机操作

翻译自: https://www.javacodegeeks.com/2019/11/become-a-master-of-java-streams-database-streams.html

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

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

相关文章

unsafehelper java_Java 9中将移除 Sun.misc.Unsafe

灾难将至&#xff0c;Java 9中将移除 Sun.misc.UnsafeOracle 正在计划在Java 9中去掉 sun.misc.Unsafe API。 这绝对将是一场灾难&#xff0c;有可能会彻底破坏整个 java 生态圈。 几乎每个使用 java开发的工具、软件基础设施、高性能开发库都在底层使用了 sun.misc.Unsafe。 下…

java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

java 根据类名示例化类Java中的类路径不仅用于加载.class文件&#xff0c;而且还可以用于加载资源&#xff0c;例如属性文件&#xff0c;图像&#xff0c;图标&#xff0c;缩略图或任何二进制内容。 Java提供了API来将这些资源读取为InputStream或URL。 假设您在项目的config文…

java课程设计进程管理_Java课设总结(个人版)

使用物理引擎JBox2D完成游戏关卡的各个物理状态模拟根据物理引擎设计Bird,Pig,Brick等游戏中出现的可运动刚体类建立JBox2d的工具类以实现###本人对这次课设的看法与吐槽 1.课设内容的脑洞是我在看完17级学长的游戏课设之后想出的 当时还没学java网络编程的内容&#xff0c;误以…

二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II

题目链接 : https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/题目描述:给定一个二叉树&#xff0c;返回其节点值自底向上的层次遍历。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09;例如&#xff1a; 给…

使用测微计收集应用程序指标

什么是千分尺&#xff1f; 千分尺是一个简单的外观&#xff0c;用于以供应商中立的方式收集Java应用程序中的指标。 您可以考虑使用SLF4J作为指标。 Micrometer内置了对许多不同指标后端的支持&#xff0c;包括Atlas&#xff0c;Datadog&#xff0c;Elastic&#xff0c;JMX等。…

只读副本和Spring Data第1部分:配置数据库

这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。 对于这个项目&#xff0c;我们的目标是建立我们的spring数据应用程序&#xff0c;并使用read仓库进行写操作&#xff0c;并基于read副本进行读操作。 为了模拟这种环境&#xff0c;我们将通过Docker使…

java结构体系_java io结构体系

Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系2. 原始处理器(适配器)与链接流处理器(装饰器)其结构图如下:Reader-Writer体系1. 基类…

javaserver_如何在JavaServer Pages中使用Salesforce REST API

javaserver摘要&#xff1a;本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com &#xff08;同时使用HTTP&#xff08;S&#xff09;和JSON&#xff09;管理数据的分步过程。 在此示例中&#xff0c;我将Mac OS X…

jmeter线程数并发数区别_如何确定Kafka的分区数、key和consumer线程数、以及不消费问题解决...

在Kafak中国社区的qq群中&#xff0c;这个问题被提及的比例是相当高的&#xff0c;这也是Kafka用户最常碰到的问题之一。本文结合Kafka源码试图对该问题相关的因素进行探讨。希望对大家有所帮助。怎么确定分区数&#xff1f;“我应该选择几个分区&#xff1f;”——如果你在Kaf…

插入排序java_「Java」各类排序算法

排序大的分类可以分为两种&#xff1a;内排序和外排序。在排序过程中&#xff0c;全部记录存放在内存&#xff0c;则称为内排序&#xff0c;如果排序过程中需要使用外存&#xff0c;则称为外排序。下面讲的排序都是属于内排序。内排序有可以分为以下几类&#xff1a;(1) 插入排…

华为光伏usb适配器_华为系列原装充电器拆解第三弹:比亚迪版华为10W充电器

在对华为18W充电器的比亚迪版和赛尔康版进行拆解之后&#xff0c;充电头网今天继续为大家带来华为10W充电器的比亚迪版和达宏版的拆解。这两种10W规格的华为充电器外观延续了华为原装充电器的风格&#xff0c;而且型号也是一样的。那么&#xff0c;我们先一起来看看比亚迪版华为…

JMetro版本11.5.10和8.5.10发布

在这里&#xff0c;我们再次使用JMetro的另一个版本。 此版本中的新增功能&#xff1a; 工具栏内控件的新样式 新的可编辑组合框样式 对其他样式的一些调整 一些修复 继续阅读以获取详细信息。 可编辑的ComboBox新样式 JMetro早期版本的可编辑ComboBox看起来非常糟糕&am…

1s后跳转 android_优雅保活方案,原来Android还可以这样保活

作者&#xff1a;NanBox保活现状我们知道&#xff0c;Android 系统会存在杀后台进程的情况&#xff0c;并且随着系统版本的更新&#xff0c;杀进程的力度还有越来越大的趋势。系统这种做法本身出发点是好的&#xff0c;因为可以节省内存&#xff0c;降低功耗&#xff0c;也避免…

wordpress致命错误怎么解决_pppoe错误是什么意思 pppoe错误怎么解决

最近有网友反应无线路由器上设置PPPoE拨号上网后&#xff0c;发现PPPoE连接不上&#xff0c;显示pppoe错误是什么意思呢?pppoe错误怎么解决呢?接下来详细为大家介绍&#xff1a;pppoe错误怎么解决无线路由器设置PPPoE拨号后&#xff0c;PPPoE拨号连接不上&#xff0c;不能够上…

java ssm 多租户_(十一)java B2B2C 源码 多级分销springmvc mybatis多租户电子商城系统- SSO单点登录之OAuth2.0登录流程(2)...

上一篇是站在巨人的肩膀上去研究OAuth2.0&#xff0c;也是为了快速帮助大家认识OAuth2.0&#xff0c;闲话少说&#xff0c;我根据框架中OAuth2.0的使用总结&#xff0c;画了一个简单的流程图(根据用户名密码实现OAuth2.0的登录认证)&#xff1a;上面的图很清楚的描述了当前登录…

几何画板200个经典课件_项目制学科联动 | 金芬娥首席工作室:灵动“画板”,研修创新,协同进步...

西湖区成立115个“项目制首席教师工作室”&#xff0c;建立中小学、幼儿园学科联动机制&#xff0c;以专业发展为目标&#xff0c;以教育问题为导向&#xff0c;整合发挥学科教研员、学科带头人和名师工作室领衔人的智力资源&#xff0c;助推教师的专业成长及区域的学科建设。西…

通过这些简单的步骤从头开始学习Java

Java是用于软件开发的最流行的编程语言之一。 无论您的最终目标或技能水平如何&#xff0c;学习和掌握Java都将为您作为开发人员打开大门。 今天&#xff0c;我们将讨论一些原因&#xff0c;我们认为您应该开始学习Java&#xff0c;然后提供有关入门的深入路线图。 为什么要学…

vs 服务容器中已存在服务_敏捷基础设施和公共基础服务

敏捷基础设施和公共基础服务敏捷基础设施和公共基础服务是微服务架构的有力支撑&#xff1b;能够简化业务开发&#xff0c;提升架构能力的基线。Cloud Native的基石是微服务架构、敏捷基础设施和公共基础服务。敏捷基础设施 - 通过容器封装环境&#xff0c;开发人员可以直接将所…

使用php吧excel数据存到数据库,php如何存excel数据到数据库

一、使用PHPExcel Parser Pro软件&#xff0c;但是这个软件为收费软件&#xff1b;二、可将EXCEL表保存为CSV格式&#xff0c;然后通过phpmyadmin或者SQLyog导入&#xff0c;SQLyog导入的方法为&#xff1a;将EXCEL表另存为CSV形式&#xff1b;打开SQLyog&#xff0c;对要导入的…

sle linux lftp禁止匿名登陆_软件测试常用linux命令整理

作为一个名软件测试工程师&#xff0c;掌握Linux的基本操作是必须的。下面罗列下linux的常用命令&#xff0c;方便大家今后操作linux时查找&#xff0c;然后通过[帮助命令]进行具体的使用。1、帮助命令man -- man 命令 查看命令的使用帮助说明。2、显示目录和文件的命令ls --…