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流写入数据库

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

  1. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  2. java流写入数据库_使用Java流查询数据库

    java流写入数据库 在本文中,您将学习如何编写纯Java应用程序,这些应用程序能够使用现有数据库中的数据,而无需编写一行SQL(或类似的语言,如HQL),而无需花费数小时将所有内容放在一起. 准备好 ...

  3. java联接pg库_成为Java流大师–第5部分:将联接的数据库表转换为流

    java联接pg库 是否可以将联接的数据库表转换为Java Stream? 答案是肯定的. 由于我们已经多次提出这个问题,因此我们决定写另一篇动手实验文章,说明如何执行更高级的Stream Joins ...

  4. java 输出流转输入流_输入输出--Java IO流

    O流01 javaIO流概述 ①Java IO即Java 输入输出系统 根据针对数据类型的处理,分为字节流和字符流: 字节流中包含输入流[InputStream]和输出流[OutputStream]两 ...

  5. java 流 复制文件_【Java】使用字节流复制文件

    其实用java程序复制文件并不难 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOE ...

  6. java字节流转字符流的步骤_字节流-java入门基础笔记-51CTO博客

    [14]字节流 一.字节流 1.什么是字节流是IO流中的一种, 可以用来读写字节数据. 2.字节流和字符流的区别计算机中存储任何数据都是以字节的形式, 所以字节流可以读写任意类型的数据. 在读写的数据 ...

  7. java对象流保存表格_使用java对象

    <21天学通Java(第7版)>-- 1.3 对象和类 本节书摘来异步社区<21天学通Java(第7版)>一书中的第1章,第1.3节,作者: [美]Rogers Cadenhe ...

  8. java压缩文件读取_用Java读取/写入压缩和非压缩文件

    java压缩文件读取 这篇文章的主要原因是尝试不要重复自己( DRY ),因为通常,我会遇到递归的需求,即读写压缩的和非压缩的文件(主要是JSON和CSV). 首先让我们看看如何读取文本文件. 注意我 ...

  9. java ioutils 写入文件_文件输入输出流工具: IOUtils使用总结

    序言 以前写文件的复制很麻烦,需要各种输入流,然后读取line,输出到输出流...其实apache.commons.io里面提供了输入流输出流的常用工具方法,非常方便.下面就结合源码,看看IOUTil ...

最新文章

  1. linux生成md5指定文件名,linux 通过MD5监控指定路径文件的变动
  2. python表示语句块采用_python中什么是语句块?
  3. 启动设备ar1失败 错误代码2_设备启动系列(2)寿力空压机
  4. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】...
  5. 工信部:我国半导体设计水平已达7nm
  6. html设置粗体字,如何在HTML输出中设置粗体字段
  7. iOS:NAV+TABLE结合
  8. UVALive6050 Primes【素数筛选+前缀和】
  9. MySQL表数据导入导出
  10. 数字孪生 工业互联网 IIoT 解决方案
  11. Bootstrap可视化布局
  12. 免费空间去广告(统计代码)方法:
  13. Barefoot可编程交换机获ATT订单
  14. 简单的Wifi网络概念
  15. 硬链接和软连接 linux 的ln命令
  16. winform 中自定义有透明度的panel,可用于加载遮盖层
  17. JAVA--阿尔法平台编程练习---篮球弹跳
  18. 稿费计算机在线,稿酬个税计算器2017
  19. HTML中常用的空白字符写法
  20. Gartner2019年十大安全项目详解

热门文章

  1. 2021牛客暑期多校训练营6
  2. Dancing Stars on Me HDU - 5533
  3. [LOJ #521]「LibreOJ β Round #3」绯色 IOI(抵达)(结论)
  4. CF802C-Heidi and Library(hard)【费用流】
  5. P6478-[NOI Online #2 提高组]游戏【dp,二项式反演】
  6. P3329-[ZJOI2011]最小割【最小割树】
  7. jzoj1281-旅行【dp】
  8. P3694-邦邦的大合唱站队【状压dp】
  9. bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】
  10. 【2018.3.17】模拟赛之三-ssl1863jzoj1367 俄罗斯方块【模拟】