日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 8 Friday:更多功能关系转换

發布時間:2023/12/3 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 8 Friday:更多功能关系转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

過去,我們一直在每個星期五為您提供有關Java 8的新內容的新文章。這是一個非常令人興奮的博客系列 ,但我們想再次將重點放在Java和SQL的核心內容上。 我們仍然偶爾會寫關于Java 8的博客,但不再是每個星期五(有些人已經注意到)。

在Java 8 Friday系列的最后一篇簡短文章中,我們要重申一個事實,我們相信未來屬于功能性關系數據轉換(與ORM相對) 。 我們使用面向對象的軟件開發范例已經花費了大約20年的時間。 我們許多人對此非常教條。 然而,在過去的十年中,“新”范式已開始在編程社區中獲得越來越多的關注: 函數式編程 。

但是,函數式編程并不是什么新鮮事物。 Lisp一直是非常早期的函數式編程語言。 XSLT和SQL也具有一定的功能(并且是聲明性的!)。 由于我們是SQL功能(和聲明性!)性質的忠實擁護者,我們為我們現在擁有Java中復雜的工具來轉換從SQL數據庫提取的表格數據而感到非常興奮。 溪流!

SQL結果集與流非常相似

正如我們之前指出的那樣, JDBC ResultSet和Java 8 Streams非常相似 。 當您使用jOOQ(使用org.jooq.Result替換JDBC ResultSet)時,情況org.jooq.Result , org.jooq.Result擴展了java.util.List ,因此自動繼承了所有Streams功能。 考慮以下查詢,該查詢允許獲取BOOK和AUTHOR記錄之間的一對多關系:

Map<Record2<String, String>, List<Record2<Integer, String>>> booksByAuthor =// This work is performed in the database // -------------------------------------- ctx.select(BOOK.ID,BOOK.TITLE,AUTHOR.FIRST_NAME,AUTHOR.LAST_NAME).from(BOOK).join(AUTHOR).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID)).orderBy(BOOK.ID).fetch()// This work is performed in Java memory // -------------------------------------.stream()// Group BOOKs by AUTHOR.collect(groupingBy(// This is the grouping key r -> r.into(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME),// This is the target data structureLinkedHashMap::new,// This is the value to be produced for each// group: A list of BOOKmapping(r -> r.into(BOOK.ID, BOOK.TITLE),toList())));

對于習慣使用jOOQ編寫SQL的人來說,Java 8 Streams API的流利性是非常習慣的。 顯然,您還可以使用jOOQ以外的其他工具,例如Spring的JdbcTemplate或Apache Commons DbUtils,或僅將JDBC ResultSet包裝在迭代器中……

與ORM相比,這種方法的優點是根本沒有任何魔術發生。 每條映射邏輯都是明確的,而且由于使用Java泛型,因此完全是類型安全的。 在此示例中, booksByAuthor輸出的類型很復雜,讀/寫有點困難,但它也具有充分的描述性和實用性。

與POJO相同的功能轉換

如果您對使用jOOQ的Record2元組類型不太滿意,那么沒問題。 您可以這樣指定自己的數據傳輸對象:

class Book {public int id;public String title;@Overridepublic String toString() { ... }@Overridepublic int hashCode() { ... }@Overridepublic boolean equals(Object obj) { ... } }static class Author {public String firstName;public String lastName;@Overridepublic String toString() { ... }@Overridepublic int hashCode() { ... }@Overridepublic boolean equals(Object obj) { ... } }

使用上述DTO,您現在可以利用jOOQ的內置POJO映射將jOOQ記錄轉換為您自己的域類:

Map<Author, List<Book>> booksByAuthor = ctx.select(BOOK.ID,BOOK.TITLE,AUTHOR.FIRST_NAME,AUTHOR.LAST_NAME).from(BOOK).join(AUTHOR).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID)).orderBy(BOOK.ID).fetch().stream().collect(groupingBy(// This is the grouping key r -> r.into(Author.class),LinkedHashMap::new,// This is the grouping value listmapping(r -> r.into(Book.class),toList())));

顯性與隱性

在Data Geekery,我們相信Java開發人員的新時代已經開始。 一個時代,Annotatiomania?(最終!)結束了,人們不再通過注釋魔術來承擔所有隱性行為。 ORM依賴大量規范來解釋每個注釋如何與其他注釋一起工作。 很難對JPA帶給我們的這種不太了解的注釋語言進行逆向工程(或調試!)。

在另一方面,SQL是很容易理解的。 表是一種易于處理的數據結構,如果您需要將這些表轉換為更面向對象或更具層次結構的表,則可以簡單地將函數應用于這些表并自己對值進行分組! 通過對這些值進行顯式分組,您將完全控制映射,就像使用jOOQ一樣,您將完全控制SQL。

這就是為什么我們認為,在未來5年中,ORM將失去相關性,人們將開始使用Java 8 Streams再次擁抱顯式 , 無狀態和無 魔術的數據轉換技術。

翻譯自: https://www.javacodegeeks.com/2014/07/java-8-friday-more-functional-relational-transformation.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Java 8 Friday:更多功能关系转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。