java流写入数据库_成为Java流大师–第4部分:数据库流

java流写入数据库

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”)返回一个将在每个Film上测试的Predicate ,并且仅当该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 , …}, …] 

注意:通过跳过(25 *(n-1)),可以找到第n页的内容。

注意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

java流写入数据库

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

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

相关文章

XML——XML Schema

【0】README 0.0&#xff09;本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML——XML Schema 的基础知识 &#xff1b;&#xff08;本文不涉及源代码&#xff0c; 很遗憾&#xff0c;以后会补充&#xff09; 【1】XML Schema 相关 1.0&#xff09;为什么引入…

怎么为pdf文件添加水印?

怎么为pdf文件添加水印&#xff1f;PDF是一种很好用的文件格式&#xff0c;这种格式能够很有效的保护我们的文件&#xff0c;但有时可能还会被破解&#xff0c;这种时候在PDF上添加水印就是比较好的方法。 综上所述&#xff0c;PDF是保密性很强的文件&#xff0c;但添加水印能够…

皖西学院计算机协会组织部,皖西学院

皖西学院关于卢义忠同志兼任安徽省高校后勤协会理事的请示安徽省委组织部:根据《关于进一步规范党政机关和企事业单位领导干部兼任社会组织职务审批管理的通知》(皖组通字〔2016〕40号)等文件精神&#xff0c;经皖西学院党委1月17日研究建议&#xff1a;因校领导分工调整&#…

java 用流创建流_成为Java流大师–第1部分:创建流

java 用流创建流在许多情况下&#xff0c;声明性代码&#xff08;例如&#xff0c;具有Streams的功能组合&#xff09;提供了出色的代码指标。 通过该动手实验文章系列进行编码&#xff0c;并成为Java Streams的主教练&#xff0c;从而成为一名更好的Java程序员。 Streams的整…

java的for循环

一、普通for循环&#xff08;1&#xff09;for循环语法 for&#xff08;initialization; condition; update&#xff09;{statements;} &#xff08;2&#xff09;语法解释 1、for语句执行时&#xff0c;首先执行初始化操作&#xff08;initialization&#xff09;&#xff0c…

XML——使用 XPath来定位信息+使用命名空间

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML——使用 XPath来定位信息使用命名空间 的基础知识 &#xff1b; 0.2&#xff09; for detailed XPath info &#xff1a; please visit ( http://www.ruanyifeng.com/blog/2009/…

计算机教室英语怎么读音,网络教室,network classroom,音标,读音,翻译,英文例句,英语词典...

多媒体教室1.多媒体教室基本组成多媒体教室由多媒体计算机、液晶投影机、数字视频展示台、中央控制系统、投影屏幕、音响设备等多种现代教学设备组成。(1)多媒体液晶投影机是整个多媒体演示教室中最重要的也是最昂贵的设备&#xff0c;它连接着计算机系统、所有视频输出系统及数…

算法一之简单选择排序

一、 选择排序的思想 选择排序的基本思想是&#xff1a;每一趟在n-i1&#xff08;i1&#xff0c;2&#xff0c;…n-1&#xff09;个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。简单选择排序的基本思想&a…

XML——流机制解析器

【0】README 0.1&#xff09; 本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML——流机制解析器 的基础知识 &#xff1b; 0.2&#xff09; for detailed StAX, please visit http://blog.csdn.net/pacosonswjtu/article/details/50569728 【1】XML——流机制…

第512章 河系量子计算机,第512章、河系量子计算机

69中文网 www.69zww.cc&#xff0c;最快更新分身投胎万界最新章节&#xff01;但AI智能所容身的量子计算机就大得有些恐怖了。其总体积丝毫不亚于一个小型河系&#xff01;什么是河系&#xff1f;银河系&#xff0c;仙女星系等等都是大小不等的河系&#xff01;而AI智能容身的量…

idea内置junit5_JUnit 5和Selenium –使用Selenium内置的`PageFactory`实现页面对象模式

idea内置junit5Selenium是一组支持浏览器自动化的工具和库&#xff0c;主要用于Web应用程序测试。 Selenium的组件之一是Selenium WebDriver&#xff0c;它提供客户端库&#xff0c;JSON有线协议&#xff08;与浏览器驱动程序进行通信的协议&#xff09;和浏览器驱动程序。 Sel…

算法二之树形选择排序

一、树形选择排序的基本思想 &#xff08;1&#xff09; 树形选择排序又称锦标赛排序&#xff08;Tournament Sort&#xff09;&#xff0c;是一种按照锦标赛的思想进行选择排序的方法。首先对n个记录的关键字进行两两比较&#xff0c;然后在n/2个较小者之间再进行两两比较&am…

计算机声卡型号价格,怎么查看电脑的声卡型号?查看声卡型号方法介绍

声卡是电脑上的硬件设施&#xff0c;任何电脑上的硬件都需要使用驱动使其运行&#xff0c;那么我们下载驱动的时候就会用到声卡型号&#xff0c;那么怎么查看电脑的声卡型号?下面小编就为大家详细介绍一下&#xff0c;一起来看看吧&#xff01;使用命令查看1、首先呢&#xff…

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

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

XML—— XSL 转换

【0】README 0.1&#xff09; 本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML—— XSL 转换 的基础知识 &#xff1b; 0.2&#xff09;XSL 转换&#xff1a; XSL 转换&#xff08;eXtensible StyleSheet Language扩展样式表语言&#xff09; (for detailed…

算法三之堆排序

一、堆(Heap)定义 &#xff08;1&#xff09;n个关键字序列Kl&#xff0c;K2&#xff0c;…&#xff0c;Kn称为&#xff08;Heap&#xff09;&#xff0c;当且仅当该序列满足如下性质&#xff08;简称为堆性质&#xff09;&#xff1a; k(i)<k(2i&#xff09;且k(i)<k(2i…

计算机宏如何设置方法,excel 如何启用宏的方法,以及如何设置excel启用宏

如何启用宏呢&#xff1f;在进行如何启用宏讲解之前&#xff0c;先来认识&#xff0c;Excel几个其余宏相关的知识点。如果Excel工作簿中包含宏&#xff0c;则将在打开工作簿之前对其进行扫描&#xff0c;以检查是否存在已知病毒。Excel宏设置有四个选项&#xff0c;如下图所示&…

怎么清理句柄_JAR文件句柄:混乱后清理!

怎么清理句柄在Ultra ESB中&#xff0c;我们使用特殊的热交换类加载器 &#xff0c;该加载器使我们可以按需重新加载Java类。 这使我们能够从字面上热交换我们的部署单元 -加载&#xff0c;卸载&#xff0c;使用更新的类重新加载&#xff0c;以及正常地逐步退出-无需重启JVM。 …

XML——生成 XML 文档(读入 XML的反向过程)

【0】README 0.1&#xff09; 本文文字描述转自 core java volume 2 &#xff0c; 旨在理解 XML——生成 XML 文档&#xff08;读入 XML的反向过程&#xff09; 的基础知识 &#xff1b; 0.2&#xff09; for source code, please visit https://github.com/pacosonTang/core…

算法四之冒泡排序

一、冒泡排序&#xff08;Bubble Sort&#xff09;思想 &#xff08;1&#xff09;冒泡排序&#xff08;Bubble Sort&#xff09;&#xff0c;是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误…