java流写入数据库

在本文中,您将学习如何编写纯Java应用程序,这些应用程序能够使用现有数据库中的数据,而无需编写一行SQL(或类似的语言,如HQL),而无需花费数小时将所有内容放在一起。 准备好应用程序之后,您将通过仅添加两行代码来学习如何使用JVM内加速功能将延迟性能提高1000倍以上。

在本文中,我们将使用Speedment,它是一个Java流ORM,可以直接从数据库模式生成代码,并且可以自动将Java Streams直接呈现为SQL,从而允许您使用纯Java编写代码。

您还将发现,通过直接在RAM中运行流的JVM内存技术,数据访问性能可以大大提高。

示例数据库

我们将使用来自MySQL的示例数据库Sakila。 它具有称为电影,演员,类别等的表格,可以在此处免费下载。

步骤1:连接到数据库

我们将开始使用可以在此处找到的Speedment Initializer配置pom.xml文件。 按“下载”,您将获得带有自动生成的Main.java文件的项目文件夹。

接下来,解压缩项目文件夹的zip文件,打开命令行,转到解压缩的文件夹(pom.xml文件所在的文件夹)

然后,输入以下命令:

mvn speedment:tool

这将启动Speedment工具并提示您输入许可证密钥。 选择“开始免费”,您将自动免费获得许可证。 现在,您可以连接到数据库并开始使用:

步骤2:产生程式码

从数据库中加载模式数据后,可以通过按“生成”按钮来生成完整的Java域模型。

这只需要一两秒钟。

步骤3:编写应用程序代码

与步骤2中的域模型一起,自动生成了Speedment实例的构建器。 打开Main.java文件,并使用以下代码段替换main()方法中的代码:

SakilaApplication app = new SakilaApplicationBuilder().withPassword("sakila-password") // Replace with your own password.build();

接下来,我们将编写一个可以打印所有电影的应用程序。 诚然,这是一个很小的应用程序,但是我们将在本文中对其进行改进。

// Obtains a FilmManager that allows us to
// work with the "film" table
FilmManager films = app.getOrThrow(FilmManager.class);// Create a stream of all films and print
// each and every film
films.stream().forEach(System.out::println);

这不是很简单吗?

运行时,Java流将在后台自动呈现为SQL。 为了真正看到呈现SQL代码,请修改我们的应用程序构建器,并使用
STREAM日志类型:

SakilaApplication app = new SakilaApplicationBuilder().withPassword("sakila-password").withLogging(ApplicationBuilder.LogType.STREAM).build();

这是运行应用程序时SQL代码的样子:

SELECT `film_id`,`title`,`description`,`release_year`, `language_id`,`original_language_id`,`rental_duration`,`rental_rate`,`length`,`replacement_cost`,`rating`,`special_features`,`last_update`FROM`sakila`.`film`,
values:[]

根据您选择的数据库类型(例如MySQL,MariaDB,PostgreSQL,Oracle,MS SQL Server,DB2,AS400等),呈现SQL代码可能有所不同。 这些变化是自动的。

上面的代码将产生以下输出(为简便起见,以下简称):

FilmImpl { filmId = 1, title = ACADEMY DINOSAUR, …, length = 86, ... }
FilmImpl { filmId = 2, title = ACE GOLDFINGER, ..., length = 48, ...}
FilmImpl { filmId = 3, title = ADAPTATION HOLES, ..., length = 50, ...}
...

步骤4:使用筛选器

Speedment流支持所有Stream操作,包括过滤器。 假设我们只想过滤那些长于60分钟的电影。 这可以通过将以下代码行添加到我们的应用程序中来完成:

films.stream().filter(Film.LENGTH.greaterThan(60)) .forEach(System.out::println);

呈现SQL:

SELECT `film_id`,`title`,`description`,`release_year`,`language_id`,`original_language_id`,`rental_duration`,`rental_rate`,`length`,`replacement_cost`,`rating`,`special_features`,`last_update`
FROM `sakila`.`film`
WHERE (`length` > ?),values:[60]

生成的输出:

FilmImpl { filmId = 1, title = ACADEMY DINOSAUR, ..., length = 86, ... }
FilmImpl { filmId = 4, title = AFFAIR PREJUDICE, ..., length = 117, ...}
FilmImpl { filmId = 5, title = AFRICAN EGG, ... length = 130, ...}

过滤器可以组合以创建更复杂的表达式,如下所示:

films.stream().filter(Film.LENGTH.greaterThan(60).or(Film.LENGTH.lessThan(30))).forEach(System.out::println);

这将返回所有短于30分钟或长于1小时的电影。 检查您的日志文件,您还将看到此Stream也呈现为SQL。

步骤5:定义元素的顺序

默认情况下,元素在流中出现的顺序是不确定的。 要定义特定的订单,您可以应用
对这样的流sorted()操作:

films.stream().filter(Film.LENGTH.greaterThan(60)).sorted(Film.TITLE).forEach(System.out::println);

呈现SQL:

SELECT `film_id`,`title`,`description`,`release_year`,`language_id`,`original_language_id`,`rental_duration`,`rental_rate`,`length`,`replacement_cost`,`rating`,`special_features`,`last_update`
FROM `sakila`.`film`
WHERE (`length` > ?)
ORDER BY `length` ASC,
values:[60]

生成的输出:

FilmImpl { filmId = 77, title = BIRDS PERDITION,..., length = 61,...}
FilmImpl { filmId = 106, title = BULWORTH COMMANDMENTS,..., length = 61,}
FilmImpl { filmId = 114, title = CAMELOT VACATION,..., length = 61,..}
...

您还可以组成多个排序器来定义主要顺序,次要顺序等。

films.stream().filter(Film.LENGTH.greaterThan(60)).sorted(Film.LENGTH.thenComparing(Film.TITLE.reversed())).forEach(System.out::println);

这将按LENGTH顺序(升序)然后按TITLE顺序(降序)对影片元素进行排序。 您可以组成任意数量的字段。

注意:如果要按升序组成两个或多个字段,则应使用该字段的方法
.comparator() 。 即
sorted(Film.LENGTH.thenComparing(Film.TITLE.comparator()))而不是 sorted(Film.LENGTH.thenComparing(Film.TITLE))

步骤6:分页并避免大对象块

通常,人们希望分页结果以避免使用不必要的大对象块。 假设我们希望每页看到50个元素,我们可以编写以下通用方法:

private static final int PAGE_SIZE = 50;public static <T> Stream<T> page(Manager<T> manager,Predicate<? super T> predicate,Comparator<? super T> comparator,int pageNo
) {return manager.stream().filter(predicate).sorted(comparator).skip(pageNo * PAGE_SIZE).limit(PAGE_SIZE);
}

此实用程序方法可以使用ANY过滤器来分页ANY表,并按ANY顺序对其进行排序。

例如,调用:

page(films, Film.LENGTH.greaterThan(60), Film.TITLE, 3)

将返回长度超过60分钟的电影流,并按标题显示第三页(即跳过150部电影并显示以下50部电影)。

呈现SQL:

SELECT `film_id`,`title`,`description`,`release_year`,`language_id`,`original_language_id`,`rental_duration`,`rental_rate`,`length`,`replacement_cost`,`rating`,`special_features`,`last_update`
FROM `sakila`.`film`
WHERE(`length` > ?)
ORDER BY`title` ASC
LIMIT ? OFFSET ?,
values:[60, 50, 150]

生成的输出:

FilmImpl { filmId = 165, title = COLDBLOODED DARLING, ... length = 70,...}
FilmImpl { filmId = 166, title = COLOR PHILADELPHIA, ..., length = 149... }
FilmImpl { filmId = 167, title = COMA HEAD, ... length = 109,...}
...

同样,如果我们使用其他数据库类型,则SQL代码将略有不同。

步骤7:JVM中的内存加速

由于您在初始化器中使用了标准配置,因此在pom.xml文件中启用了In-JVM内存加速。 要在应用程序中激活加速,只需修改初始化代码,如下所示:

SakilaApplication app = new SakilaApplicationBuilder().withPassword("sakila-password").withBundle(InMemoryBundle.class).build();// Load data from the database into an in-memory snapshotapp.getOrThrow(DataStoreComponent.class).load();

现在,表流将直接从RAM提供,而不是呈现SQL查询。 内存索引也将加快筛选,排序和跳过。 内存中的表和索引都存储在堆外,因此它们不会增加垃圾回收的复杂性。

在我的笔记本电脑(Mac Book Pro,15英寸,2015年中,16 GB,i7 2.2 GHz)上,对于我计算与过滤器匹配的电影和经过分类的电影流,与对在本地计算机上运行MySQL数据库(版本5.7.16)的标准安装。

摘要

在本文中,您了解了使用纯Java流查询现有数据库有多么容易。 您还了解了如何使用JVM内存流技术加快对数据的访问。 Sakila数据库和Speedment均可免费下载和使用,请自己尝试。

翻译自: https://www.javacodegeeks.com/2018/09/query-databases-using-java-streams.html

java流写入数据库

java流写入数据库_使用Java流查询数据库相关推荐

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

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

  2. QQ会员抽奖系统引流源码_适合引流,营销,推广

    简介: 今天分享一款qq会员抽奖系统源码,客户抽中QQ会员,提示需要分享到6个群后才能领取, 分享群后直接跳到自己想让加的群,纯暴力引流,适合引流,营销,推广:本程序无需后台. 安装步骤: 1.准备好 ...

  3. 大文件表空间+创建大文件表空间+查询数据库表空间类型信息+查询数据库表空间类型信息...

    1用于解决存储文件大小不够的问题 2与普通表空间不同的地方在于大文件表空间只对应唯一一个数据文件或临时文件,普通表空间可最多1022个数据文件或临时文件 3大文件表空间对应文件可达4G个数据块大小,普 ...

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

    java流写入数据库 SQL一直是一种声明性语言,而Java长期以来势在必行. Java流改变了游戏规则. 通过本动手文章编写您的方式,并学习如何使用Java流对RDBMS数据库执行声明性查询,而无需 ...

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

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

  6. java io 文件路径_【IO流】java中文件路径(相对路径、绝对路径)相关类及方法...

    1. URL 菜鸟教程:Java URL处理 通常推荐对http等协议进行使用,若操作(file:)部分属性将无意义,建议getFile(). 相关:URLConnections 类 可以打开连接进行 ...

  7. Java io流小技巧_选择用流的小规律(java)基本的io流

    选择流的规律 1 首先我们要明确源和目的 源: InputStream Reader 目的::OutputStream Write 2 我们要判断源和目的是不是纯文本 源是纯文本 :Reader 否则 ...

  8. java io字符输出流_【Java的IO流之文件字符输入输出流 25】

    一.FileReader:读取字符流:FileWriter:写入字符流 字符流可以读取和写入汉字和英文,字节流不能读取和写入汉字 二.FileReader流 1.常用的构造方法 FileReader( ...

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

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

最新文章

  1. oracle物理备份与恢复,Oracle 备份与恢复概念原理学习
  2. Android 的 SDK Manager 无法启动 闪退解决方法
  3. python 3.x urllib学习
  4. 程序员交流平台_「建议收藏」10个适合程序员逛的在线社区
  5. 即日起,正式进入编程世界!
  6. centos6.7x86_64php7安装笔记 new
  7. Docker搭建SonarQube代码质量检查平台
  8. SSH密钥对登录的原理和实践
  9. c语言 获取硬盘号,C语言获得硬盘序列号
  10. Ubuntu上安装Chrome浏览器
  11. 2cm有多长实物图_2cm(2cm有多长实物图)
  12. 传染病研究-靶向下一代宏基因组测序(mNGS)分析
  13. TCP/IP路由技术(第1卷)(第2版) + TCP/IP路由技术(第2卷)(第2版)
  14. 公众号排名优化被动引流截流之关于公众号注册申请的那些事儿
  15. 158 鄭光弼 守夫
  16. TL-WR886N路由器+树莓派绑定IP地址
  17. windows getLastError 错误码大全
  18. 使用 RTSCapture 类可以防止帧处理速度小于接收速度而导致花屏或者断流(崩溃)opencv-python RTSP
  19. GD32VF103_CAN发送
  20. 阿里云视觉智能API,核心技术一站共享!

热门文章

  1. LOJ洛谷P3225:矿场搭建(割点、点双)
  2. 质数和分解(动态规划)
  3. jzoj4802-[GDOI2017模拟9.24]探险计划【费用流,拆点】
  4. jzoj1029-电子眼【树形dp】
  5. AIsing Programming Contest 2020 总结
  6. Stack(nowcoder 11253-K)
  7. Javafx的WebEngine的url加载不输出结果坑,gc回收了局部变量
  8. JAVA多线程和并发面试问题
  9. 如何让面试官认可你的简历
  10. Hibernate之映射