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

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

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

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

相关文章

Linux 命令之 id -- 显示用户ID和组ID

文章目录命令介绍常用选项参考示例显示当前用户的用户id及所属用户组的信息显示用户所属群组的ID显示用户所属附加群组的ID显示指定用户信息命令介绍 id命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。组ID&#xff08;GID&#xff09;则对应…

SpringCloud局部过滤器自定义

一、实现步骤&#xff1a; 在gateway_service中编写MyParamGatewayFilterFactory类实现业务代码&#xff1a;循环请求参数中是否包含name&#xff0c;如果包含则输出参数值修改配置文件访问请求测试&#xff0c;带name参数 二、在gateway_service中编写MyParamGatewayFilterF…

enum.values_占用内存的Enum.values()方法

enum.values我是Java 枚举的忠实拥护者 。 似乎我们一直在等待获得它&#xff0c;但是当我们最终获得它&#xff08; J2SE 5 &#xff09;时&#xff0c;该枚举比C和C 提供的枚举要好得多&#xff0c;对我来说似乎“ 值得等待” 。 与Java enum一样好&#xff0c;它也不是没有问…

搭建配置中心微服务

一、实现步骤&#xff1a; 创建配置中心SpringBoot项目config_server配置坐标依赖启动类添加开启配置中心服务注解配置服务中心application.yml文件启动测试 二、创建配置中心SpringBoot项目config_server 配置坐标依赖 需要依赖父工程 <?xml version"1.0" en…

Linux命令之 users -- 显示当前登录的用户

文章目录命令介绍参考示例查看当前登录的所有用户命令介绍 users 命令用于显示当前登录系统的所有用户的用户列表。每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话&#xff0c;那他的用户名将显示相同的次数。 参考示例 查看当前登录的所有用户 [rooth…

使用Spring Boot和H2可以正常工作的原型

我们确实在弹簧上使用了很多h2&#xff0c;特别是对于单元测试。 但是&#xff0c;我们可能希望有一个功能齐全的原型来显示数据&#xff0c;而不是进行单元测试。 H2是最理想的选择&#xff0c;它在spring上运行良好&#xff0c;与大多数数据库都具有良好的语法兼容性&#x…

服务去获取配置中心配置

目标&#xff1a;改造user_service工程&#xff0c;配置文件不再由微服务项目提供&#xff0c;而是从配置中心获取。 实现步骤&#xff1a; 添加配置中心客户端启动依赖修改服务提供者的配置文件启动服务测试效果 一、添加依赖 <!--spring cloud 配置中心--> <depe…

Linux查看用户信息/查看所有用户信息的命令

文章目录通过文件 /etc/passwd 来查看所有用户信息通过文件 /etc/shadow 查看所有用户信息使用 getent 命令查看所有用户信息使用 compgen 命令查看所有的用户信息相关文件/etc/passwd/etc/passwd 文件内容格式说明/etc/shadow/etc/group/etc/group 文件内容格式说明/etc/gshad…

graalvm_GraalVM上的Picocli:极快的命令行应用程序

graalvmGraalVM GraalVM允许您提前将程序编译为本地可执行文件。 与Java VM相比&#xff0c;生成的程序具有更快的启动时间和更低的运行时内存开销。 这对于通常寿命很短的命令行实用程序尤其有用。 GraalVM对Java反射的支持有限&#xff0c;它需要提前知道反射访问的程序元素…

Linux 命令之 getent -- 查看记录

文章目录命令介绍常用选项参考示例查看文件 /etc/protocols 中的所有记录查看指定用户组是否存在&#xff0c;若不存在则创建指定的用户组根据主机名称&#xff0c;查看对应的IP地址根据域名查找对应的IP根据用户名查找对应的UID获取当前登陆用户的信息根据UID查找用户名查找那…

运行SpringBoot时:Type javax.xml.bind.JAXBContext not present

原因和简单介绍 我有一些代码使用JAXB API类&#xff0c;它们是作为Java 6/7/8中JDK的一部分提供的。当我使用Java 9运行相同的代码时&#xff0c;在运行时我得到错误&#xff0c;指示无法找到JAXB类。 自Java 6以来&#xff0c;JAXB类已作为JDK的一部分提供&#xff0c;为什么…

Linux 命令之 chfn -- 修改用户信息

文章目录命令简介常用选项参考示例改变用户 root 的 finger 信息命令简介 chfn 命令的英文全称是 change finger&#xff0c;即用来改变 finger 命令显示的信息。这些信息都存放在 /etc/passwd 文件里。若不指定任何选项&#xff0c;则chfn 命令会进入问答式界面。 常用选项 …

cassandra可视化_容器化Spring Data Cassandra应用程序

cassandra可视化我正在继续学习Docker的旅程。 在这一点上&#xff0c;我仍然保持简单。 这次&#xff0c;我将解决将Spring和Cassandra应用程序转换为使用容器而不是在主机上本地运行的问题。 更确切地说&#xff0c;使用Spring Data Cassandra整理应用程序。 我希望我前几天…

自定义Mybatis框架

一、开发环境的准备及统一 1、 Jdk环境&#xff1a;JDK 1.8 64bit 2、 Maven环境&#xff1a;MAVEN 3.3.9 二、创建Maven工程并引入坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…

Linux 命令之 userconf -- 设置用户账号

文章目录命令介绍常用选项参考示例新增用户账号新增群组删除用户账号删除群组命令介绍 userconf的命令全称是“user config”&#xff0c;该命令是用户账号设置程序。 userconf实际上为linuxconf的符号连接&#xff0c;提供图形界面的操作方式&#xff0c;供管理员建立与管理各…

javafx 动画没效果_通过JavaFX标注制作动画效果

javafx 动画没效果在本文中&#xff0c;您将学习如何使用JavaFX的动画API创建标注。 您可以在https://www.youtube.com/watch?vXTHbB0LRdT4的 YouTube网站上查看这些标注的演示示例。 什么是标注&#xff1f; 我敢肯定&#xff0c;您已经看过广告或科幻电影&#xff0c;它们使…

基于自定义Mybatis框架实现数据库操作

一、场景模拟 基于自定义Mybatis框架和已有的Mysql数据库Mybatis&#xff0c;查询所有用户信息。 二、创建工程并引入自定义Mybatis框架的坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0…

javafx按钮设计风格_Java,JavaFX的流畅设计风格按钮,切换按钮和工具提示

javafx按钮设计风格你好&#xff0c;我们又见面了&#xff01; 这个周末&#xff0c;在业余时间&#xff0c;我继续从事JMetro的工作。 最终结果是新的Button和ToggleButton深色和浅色样式。 这些新样式包括按下按钮时的新动画。 可以通过CSS打开和关闭。 最后&#xff0c;我…

MySQL数据库变量_数据库参数_MySQL变量_系统变量_用户变量

文章目录MySQL 变量分类系统变量查看系统变量设置系统变量如何通过配置文件来设置变量值通过命令行选项来设置变量值动态设置全局级的系统变量设置静态的系统变量设置会话级的系统变量引用系统变量总结用户自定义变量用户变量声明定义用户变量查看用户变量的值参考示例使用命令…

Mybatis框架快速入门

一、场景模拟 基于自定义Mybatis框架和已有的Mysql数据库Mybatis&#xff0c;查询所有用户信息。 二、创建工程并引入Mybatis框架的坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…