聊城网站推广动态,wordpress 移动端不显示,个人网站如何获得流量,广东建设信息网三库一平台官网java流写入数据库在本文中#xff0c;您将学习如何编写纯Java应用程序#xff0c;这些应用程序能够使用现有数据库中的数据#xff0c;而无需编写一行SQL#xff08;或类似的语言#xff0c;如HQL#xff09;#xff0c;而无需花费数小时将所有内容放在一起。 准备好应用… 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_updateFROMsakila.film,
values:[] 根据您选择的数据库类型例如MySQLMariaDBPostgreSQLOracleMS SQL ServerDB2AS400等呈现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 StreamT page(ManagerT 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 BYtitle 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代码将略有不同。 步骤7JVM中的内存加速 由于您在初始化器中使用了标准配置因此在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 Pro15英寸2015年中16 GBi7 2.2 GHz上对于我计算与过滤器匹配的电影和经过分类的电影流与对在本地计算机上运行MySQL数据库版本5.7.16的标准安装。 摘要 在本文中您了解了使用纯Java流查询现有数据库有多么容易。 您还了解了如何使用JVM内存流技术加快对数据的访问。 Sakila数据库和Speedment均可免费下载和使用请自己尝试。 翻译自: https://www.javacodegeeks.com/2018/09/query-databases-using-java-streams.htmljava流写入数据库