java orm框架有哪些_Java Stream ORM现在带有JOIN

java orm框架有哪些

Speedment是一个Java Stream ORM工具包和运行时,它使您可以将数据库表作为标准Java Streams查看。 由于不必混合使用Java和SQL,因此该应用程序变得更加紧凑,从而使其开发速度更快,更不容易出错并且易于维护。 流也严格地是类型安全的,并且是惰性构造的,因此当元素被流消耗时,仅从数据库中提取最小量的数据。

现在,新版本的Speedment 3.1.1“ Homer”还支持将动态联接的表视为标准Java Streams。 开发开发数据库表之间关系的Java应用程序时,这很重要。

在下面的示例中,我使用了MySQL的开源Sakila电影数据库内容,您可以在此处下载。 Speedment适用于任何主要的关系数据库类型,例如Oracle,MySQL,Microsoft SQL Server,PostgreSQL,DB2,MariaDB,AS400等。

在单个表上流式传输

以下代码段将创建一个所有Film.RATING为“ PG-13”的Film对象的List ,并且该List按Film.LENGTH顺序排序:

List<Film> list = films.stream().filter(Film.RATING.equal("PG-13")).sorted(Film.LENGTH).collect(toList());

该流将在后台自动呈现给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 (`rating`  = ? COLLATE utf8_bin) 
ORDER BY`length` ASCvalues:[PG-13]

因此,优点是您可以使用类型安全的Java表达数据库查询,然后通过标准Java流使用结果。 您不必编写任何SQL代码。

连接几张桌子

从“电影”表的Appart来看,Sakila数据库还包含其他表。 其中之一是称为“语言”的表。 每个Film实体都使用名为“ language_id”的列来表示电影中所使用的Language的外键。

在此示例中,我将展示如何创建表示这两个表的联接的标准Java Stream。 这样,我们可以获得匹配的Film/Language实体对的Java流。

Join对象是使用JoinComponent创建的,可以通过以下方式获得:

// Visit https://github.com/speedment/speedment
// to see how a Speedment app is created. It is easy!
Speedment app = …;JoinComponent joinComponent = app.getOrThrow(JoinComponent.class);

抓住JoinComponent ,就可以开始创建Join对象,如下所示:

Join<Tuple2<Film, Language>> join = joinComponent.from(FilmManager.IDENTIFIER).innerJoinOn(Language.LANGUAGE_ID).equal(Film.LANGUAGE_ID).build(Tuples::of);

现在我们已经定义了Join对象,我们可以创建实际的Java Stream:

join.stream().map(t2 -> String.format("The film '%s' is in %s",t2.get0().getTitle(), // get0() -> Filmt2.get1().getName()   // get1() -> Language)).forEach(System.out::println);

这将产生以下输出:

The film 'ACADEMY DINOSAUR' is in English
The film 'ACE GOLDFINGER' is in English
The film 'ADAPTATION HOLES' is in English
...

在上面的代码中,方法t2.get0()将从元组( Film )检索第一个元素,而方法t2.get1()将从元组( Language )检索第二个元素。 默认通用元组内置在Speedment中,因此Tuple2不是Guava类。 速度不依赖于任何其他库。 在下面,您将看到如何为连接的表使用任何类构造函数。 同样,Speedment将自动从Java渲染SQL代码,并将结果转换为Java Stream。 如果启用流日志记录,我们可以确切看到如何呈现SQL代码:

SELECTA.`film_id`,A.`title`,A.`description`,A.`release_year`,A.`language_id`,A.`original_language_id`,A.`rental_duration`,A.`rental_rate`,A.`length`,A.`replacement_cost`,A.`rating`,A.`special_features`,A.`last_update`,B.`language_id`,B.`name`,B.`last_update` 
FROM `sakila`.`film` AS A
INNER JOIN `sakila`.`language` AS B 
ON(B.`language_id` = A.`language_id`)

有趣的是,可以创建一次Join对象,然后反复使用它来创建新的Streams。

多对多关系

Sakila数据库还定义了少数多对多关系。 例如,表“ film_actor”包含将影片链接到演员的行。 每部电影可以有多个演员,并且每个演员可能都出现在多部电影中。 表格中的每一行都将特定的Film链接到特定的Actor 。 例如,如果Film描述了12个Actor entities, then FilmActor包含12个条目,它们全部具有相同的film_id但具有不同的actor_id。 本示例的目的是创建Java Stream中所有电影和出现的演员的完整列表。 这是我们如何将三个表连接在一起的方法:

Join<Tuple3<FilmActor, Film, Actor>> join = joinComponent.from(FilmActorManager.IDENTIFIER).innerJoinOn(Film.FILM_ID).equal(FilmActor.FILM_ID).innerJoinOn(Actor.ACTOR_ID).equal(FilmActor.ACTOR_ID).build(Tuples::of);join.stream().forEach(System.out::println);

上面的代码将产生以下输出(为便于阅读而设置格式):

...
Tuple3Impl {FilmActorImpl { actorId = 137, filmId = 249, lastUpdate = 2006-02-15 05:05:03.0 },FilmImpl { filmId = 249, title = DRACULA CRYSTAL, description =...,ActorImpl { actorId = 137, firstName = MORGAN, lastName = WILLIAMS,...}
}Tuple3Impl {FilmActorImpl { actorId = 137, filmId = 254, lastUpdate = 2006-02-15 05:05:03.0 },FilmImpl { filmId = 254, title = DRIVER ANNIE, description = ...,ActorImpl { actorId = 137, firstName = MORGAN, lastName = WILLIAMS, ...}
}Tuple3Impl {FilmActorImpl { actorId = 137, filmId = 263, lastUpdate = 2006-02-15 05:05:03.0 },FilmImpl { filmId = 263, title = DURHAM PANKY, description = ... },ActorImpl { actorId = 137, firstName = MORGAN, lastName = WILLIAMS,... }
}
...

加入自定义元组

正如我们在上面的例子中注意到,我们没有实际使用的FilmActor在Stream对象,因为它只是用来连接FilmActor在加入阶段对象在一起。

当使用build()方法build() Join对象时,我们可以提供一个自定义构造函数,该构造函数要应用于数据库的传入实体。 构造函数可以是任何类型,因此您可以编写自己的Java对象,该对象包含例如FilmActor或它们包含的并且感兴趣的任何列。

在此示例中,我证明了(lambda)构造函数只是完全丢弃了链接的FilmActor对象:

Join<Tuple2<Film, Actor>> join = joinComponent.from(FilmActorManager.IDENTIFIER).innerJoinOn(Film.FILM_ID).equal(FilmActor.FILM_ID).innerJoinOn(Actor.ACTOR_ID).equal(FilmActor.ACTOR_ID).build((fa, f, a) -> Tuples.of(f, a));join.stream().forEach(System.out::println);

上面的代码将产生以下输出(为便于阅读而设置格式):

...
Tuple2Impl {FilmImpl { filmId = 249, title = DRACULA CRYSTAL, description = ... },ActorImpl { actorId = 137, firstName = MORGAN, lastName = WILLIAMS, ...}
}
Tuple2Impl {FilmImpl { filmId = 254, title = DRIVER ANNIE, description = A... }, ActorImpl { actorId = 137, firstName = MORGAN, lastName = WILLIAMS,...}
}
Tuple2Impl {FilmImpl { filmId = 263, title = DURHAM PANKY, description = ... }, ActorImpl { actorId = 137, firstName = MORGAN, lastName = WILLIAMS,...}
}
...

因此,在Film中存在Actor下,我们只会获得匹配的FilmActor实体对。 在流中永远不会看到链接对象FilmActor

试试看!

在本文的整个过程中,您已经学习了如何使用Speedment流处理一个或几个数据库表。

访问GitHub上的 Speedment开源并尝试一下!

阅读《用户指南》中有关新JOIN功能的所有信息。

翻译自: https://www.javacodegeeks.com/2018/05/java-stream-orm-now-with-joins.html

java orm框架有哪些

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

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

相关文章

linux pdb创建表空间,ORACLE12C PDB创建默认表空间和用户语句(示例代码)

第一次接触到12C CDB和PDB数据库&#xff0c;且客户提供的是ORACLE一体机&#xff0c;只有访问权&#xff0c;费劲周折&#xff0c;今记录12C创建默认路径表空间语句和用户--创建默认表空间&#xff1a;create tablespace tablesapce_name datafile size 500M autoextend on …

用户在页面输入的中文数据,servlet如何获得正确的中文值

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 告诉浏览器&#xff0c;返回的是html页面&#xff0c;而且是以utf-8编码的response.setContentType("text/html;charsetutf-8");//reques…

java编写排序的代码_在Java 8之前,您编写了几行代码来对对象集合进行排序?...

java编写排序的代码在Java 8之前&#xff0c;您编写了几行代码来对对象集合进行排序&#xff1f; Java 8您需要多少个&#xff1f; 您可以在Java 8中用一行完成。 让我们看看下面的Employee类。 public class Employee {private String name;private Integer age;public Emp…

java全局变量和局部变量_Java 10 –局部变量类型推断

java全局变量和局部变量在本文中&#xff0c;我们将看到作为JEP 286的一部分提出的名为Local Variable Type Inference的Java10功能。 从Java的第一个版本开始&#xff0c;它是一种强类型化的语言&#xff0c;我们需要提及每种变量数据类型。 我们都感到Java是冗长的语言&#…

JS_Java_Oracle_MySQL截取字符串的函数

JS 截取字符串 函数 substring(indexStart, indexEnd)&#xff1a; function f1() {var s abcd;// 字符串的字符下标从0开始&#xff0c;从下标为2的字符c开始截取&#xff0c;截取到下标为3的字符d为止&#xff0c;含头不含尾&#xff0c;所以字符d没有被截取&#xff0c;最…

linux安装meld rpm,Linux meld安装

meld是一款图形化的文本比较工具&#xff0c;该工具在windows与linux平台下均有对应版本&#xff0c;最新版本为3.14.2&#xff0c;附上下载地址http://meldmerge.org/meldmeld相较diff命令其输出结果更加直观&#xff0c;因此在linux下使用该工具进行程序源码的比较。忘了说了…

linux注册平台驱动,关于Linux驱动的平台注册方式-- platform_driver_register

http://hi.baidu.com/deep_pro/blog/item/754f7764b73099fbf636544a.htmlcdev_add 、register_blkdev 这样的驱动注册函数platform_driver_register这样的写法&#xff0c;但是没有看到哪本书介绍了相关内容简要说&#xff0c;使用这种方式&#xff0c;可以轻松的实现device和d…

JDBC连接Oracle数据库的参数配置

Oracle 的连接 URL 字符串&#xff1a;jdbc:oracle:thin:host:port:sid 在数据库配置文件 db_oracle.properties 的配置字段如下&#xff1a; urljdbc:oracle:thin:localhost:1521:orcl dbUserlwx dbPassword123456 driverNameoracle.jdbc.OracleDriver

jdk 1.8 字符串+_JDK 9/10/11:Java字符串上+ =的副作用

jdk 1.8 字符串问题“ 为什么array [i &#xff05;n] i ”在Java 8和Java 10中给出不同的结果&#xff1f; ”已于本周初发布在StackOverflow.com上 。 它指出JDK9和更高版本中存在的Java编译器中的错误 &#xff0c;但JDK8中不存在。 如StackOverflow线程上所述&#xff0…

IntelliJ IDEA for Mac 如何设置字体和字号

按组合键 Command , 打开偏好设置窗口&#xff0c;在左侧菜单导航栏找到 Editor --> Font&#xff0c;如下图所示&#xff1a;

vs mono linux,[.NET][C#.NET]走跳在Linux的人生(八).NET Core与Mono执行

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;我们来试试用.NET Core从Windows环境开发&#xff0c;然后porting到Linux环境(布署及执行.NET Core)&#xff0c;之前曾看过stackoverflow文章提到Mono的性能问题&…

java char类型空值_展望Java的未来:空值类型

java char类型空值尽管有前途的Java值类型不是迫在眉睫&#xff0c;但我偶尔还是喜欢在OpenJDK valhalla-dev邮件列表中打听一下&#xff0c;以了解事情的进展情况并了解即将发生的事情。 诚然&#xff0c;由于我对所用术语的了解有限&#xff0c;并且其中某些消息的底层细节&a…

IntelliJ IDEA 如何设置编辑窗口的背景图片

按下组合键 Shift Command A&#xff0c;打开查找动作的窗口&#xff0c;在输入框中输入 set Background Image&#xff0c;然后选中它&#xff0c;如下图所示&#xff1a; 背景图片设置窗口如下所示&#xff1a;

2013下半年福建高等学校非计算机专业学生计算机二级c语言原题,2013年福建省计算机二级c语言真题及答案(填空题部分)...

1、程序Ccon441.c的功能是&#xff1a;从键盘输入一个直角三角形的两条直角边a和b&#xff0c;计算并输出其周长和面积。将程序填写完整。#include#includevoid main(){double a,b,c,circle,area;printf("Input 2 edges:");scanf(/**/ "%lf %lf" /**/,&…

spring boot示例_Spring Boot完成示例

spring boot示例这篇文章提供了一个使用Spring Boot开发松耦合的REST服务的完整示例。 使用spring boot&#xff0c;我们可以开发可独立运行的生产就绪的Java应用程序&#xff0c;使其成为独立的应用程序&#xff0c;它具有最小的依赖关系并且与其他应用程序的耦合较少。 大多数…

IntelliJ IDEA for Mac的窗口操作

最大化代码编辑窗口的快捷键&#xff1a;Fn Shift Command F12

c++语言编译环境,Windows安装C++开发环境-C++开发环境搭建-嗨客网

Windows安装C语言开发环境教程这里&#xff0c;我们选择使用 Dev-C。Dev-C下载地址https://sourceforge.net/projects/orwelldevcpp/Dev-C下载打开上面的链接&#xff0c;打开 Dev-C 的下载页面&#xff0c;如下图所示&#xff1a;这里我们点击 Download&#xff0c;跳转到下载…

软件实施与硬件实施的区别_实施白色标签

软件实施与硬件实施的区别有时&#xff08;根据我的经验&#xff0c;很多时候&#xff09;您需要为应用程序添加白色标签。 您通常可以以SaaS方式运行它&#xff0c;但是一些重要的或高知名度的客户端可能需要专用部署或本地部署&#xff0c;或者只是在云部署中“自己的一角”。…

Sublime Text 设置在标签页中打开文件

按组合键 Command , 打开配置文件&#xff0c;如下图所示&#xff0c;左边的是系统配置文件&#xff0c;里面都是默认的配置内容&#xff0c;你无法修改&#xff0c;但是你可以复制到右边的用户级别的配置文件中。 Sublime Text 默认打开一个文件时都会打开一个新的窗口&…

c语言计算机培训,C语言计算机基础学习||新手入门必看

本次内容笔者将完全抛弃传统教学的形式&#xff0c;通过自己所学所闻得出来的心得&#xff0c;用通俗易懂的语言结合生活&#xff0c;来让大家更好的认识计算机编程&#xff0c;更好的入门计算机基础。笔者也想用自己的论述告诉大家&#xff0c;专业知识有时会比较枯燥乏味点&a…