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框架有哪些

java orm框架有哪些_Java Stream ORM现在带有JOIN相关推荐

  1. ORM框架如何选型——各大ORM框架比较

                                             ORM框架如何选型--各大ORM框架比较 现有ORM框架或ORM相关框架主要有Hibernate,Mybatis.这两 ...

  2. orm框架有哪些_java技术哪些是必学的?

    我们接触过java需要的小伙伴们都知道java是一门强大而又复杂的编程语言,现如今在互联网行业,java的身影随处可见,可能刚学习的小伙伴们会被java语言庞大的体系图吓到,不过知识毕竟是一个积累的过 ...

  3. java五大框架有哪些_Java五大框架

    2017-6-13Lifusen 此文章仅代表个人观点,如有问题提出请联系Q:570429601 1.Hibernate (开放源代码的对象关系映射框架) Hibernate是一个开放源代码的对象关系 ...

  4. 什么是ORM框架?常用的orm框架有哪些?能否不用ORM框架直接使用SQL语句创建WebAPI?

    ORM(Object-Relational Mapping,对象关系映射)框架是一种将面向对象程序中的实体类(对象)与关系型数据库中的表之间建立映射关系的技术.它允许开发人员使用面向对象编程语言来操作 ...

  5. java爬虫框架哪个好_java爬虫框架的使用

    原标题:java爬虫框架的使用 随着互联网的发展,编程程序语言也开始被越来越多的人所掌握,但是自始至终,java语言一直是被使用范围最广的编程语言.今天,武汉中软国际主要给大家讲解的是java语言中的 ...

  6. java集合框架的接口_Java集合框架之Collection接口详解

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

  7. java开源框架有哪些_java web开发框架有哪些

    1 java web开发框架有哪些 java,互联网发展出来的产物,如今变成了屈指可数的几大编程语言之一,他的未来是不可限量的.因此很多人都想要学会这门技术,希望在以后能有他的一席之地.那么下面小编给 ...

  8. java spring框架怎么学_JAVA学习之路~spring框架(一)

    一.MVC思想M:Model 数据模型(javaBean实体类) V:View 视图(前端jsp,html等等) C:Controller 控制层(处理业务逻辑) 二.高级框架介绍Dao层: MyBa ...

  9. java集合框架的接口_Java集合框架——Set接口

    第三阶段 JAVA常见对象的学习 集合框架--Set接口 List集合的特点是有序的,可重复的,是不是存在这一种无序,且能保证元素唯一的集合呢?(HashSet )这就涉及到我们今天所要讲的Set集合 ...

最新文章

  1. 10.15 iptables filter表案例
  2. 天龙八部凤鸣镇目标服务器无法响应,Jmeter给NoHttpResponseException:目标服务器无法响应错误...
  3. spring cloud构建互联网分布式微服务云平台-docker部署spring cloud项目
  4. 打开高效文本编辑之门_调用Linux的sed命令
  5. 算法学习——动态规划之装载问题
  6. 最近用到的浏览器兼容javascript总结
  7. tcpdump 不显示指定ip_wordpress首页不显示指定分类文章的方法
  8. ps黑作坊终极天空大师 一键换天空终极版破解版扩展面板
  9. 微信公众号开发之发送模板消息
  10. 基于IM实现直播礼物效果
  11. 华为快应用 阻止事件冒泡
  12. 中国传统文化课程笔记
  13. 搜索引擎 百度 高级搜索
  14. 友盟+吕志国:数据智能让天下没有难做的营销
  15. Hive数据的上传(Load、Insert)和下载
  16. 快手上用计算机算出一段话,快手一边说话一边出字是怎么弄的 可以这样做
  17. win8激活及bootMGR is missing问题的解决
  18. PC端如何查看WiFi密码
  19. HTML样式表两个表格距离为零,css表格单元格间距怎么调整?
  20. 库里、奥尼尔等明星们带货NFT有哪些法律风险?

热门文章

  1. 牛客网【每日一题】4月28日题目精讲 美味菜肴
  2. BZOJ #3166. [Heoi2013]Alo(可持久化trie树+set)
  3. P6113-[模板]一般图最大匹配【带花树】
  4. P3203-[HNOI2010]弹飞绵羊【分块】
  5. 【SPFA】桐人的约会
  6. Codefroces1077F2. Pictures with Kittens (hard version)
  7. SpringBoot @Async加在实现接口类的非接口方法上获取Bean异常
  8. 分享10道常考Java面试题及答案
  9. Java IO: 流
  10. StringTokenizer的使用