Java 8:对速度3.0.1“森林”流ORM的更深入了解
沿著這條路
我一直在為開源項(xiàng)目Speedment (它是Stream ORM Java Toolkit和Runtime)做出貢獻(xiàn),并且剛剛發(fā)布了一個新的主要版本3.0.1“ Forest”。 版本的發(fā)布以加利福尼亞州帕洛阿爾托的大街小巷命名,大多數(shù)貢獻(xiàn)者都在這里工作。 沿Middlefield Road向南行駛,每個新的主要發(fā)行版本都獲得了新的名稱。 新版本現(xiàn)已模塊化,可幫助開發(fā)人員保持良好的步伐。 Speedment用戶還擁有大量新功能,在本文中,我們將探討一些發(fā)現(xiàn)的東西!
堅(jiān)持不懈
現(xiàn)在,習(xí)慣于較早的ORM的人們可以在從數(shù)據(jù)庫創(chuàng)建,更新或刪除實(shí)體時以相同的方式使用Speedment。 例如,我們可以在數(shù)據(jù)庫“ JPA樣式”中創(chuàng)建實(shí)體,如下所示:
Hare hare = new HareImpl(); hare.setName("Flopsy"); hare.setAge(1); hare.setColor("Gray");entityManager.persist(hare); // Persists (=inserts) the new Hare in the database雖然這不是什么大變化,但仍然很方便。
聲明式流組成
速度數(shù)據(jù)庫查詢表示為對標(biāo)準(zhǔn)Java 8流的操作。 在新版本中,Speedment API提供了返回函數(shù)而不是直接對對象進(jìn)行操作的方法。 這簡化了稱為“聲明性流組合”的操作,這僅意味著編寫流變得更加容易和高效。
讓我們仔細(xì)看一個示例,在該示例中,我們希望聯(lián)接來自兩個不同表的對象。 我們有兩個表“ hare”和“ carrot”,其中“ carrot”具有一個名為“ owner”的字段,該字段是“ hare”。“ id”列的外鍵。 任務(wù)是構(gòu)建一個包含所有Hare實(shí)體作為鍵的Map,并通過其外鍵將屬于特定Hare的Carrot實(shí)體列表作為值。 可以這樣表示:
Map<Hare, List<Carrot>> joinMap = carrots.stream().collect(groupingBy(hares.finderBy(Carrot.OWNER)) // Applies the finderBy(Carrot.OWNER) classifier); 的
goupingBy()方法需要一個
Function ,從一個映射 Carrot到 Hare實(shí)體。 因此,通過處理返回函數(shù)的方法,我們的代碼變得非常緊湊。 這也開辟了未來優(yōu)化流的方法,因?yàn)榭梢栽趩恿髦霸诹鞴艿乐凶R別和分析這些功能。 應(yīng)該注意的是 collect()和 groupingBy()方法是標(biāo)準(zhǔn)的Java 8方法。
更好的代碼生成
Speedment根據(jù)數(shù)據(jù)庫架構(gòu)數(shù)據(jù)自動生成代碼。 Speedment的一件好事是,我們可以看到,理解和更改生成的代碼。 與其他ORM相比,這使事情變得“不可思議”,并將顯影劑置于駕駛座上。 新的代碼生成功能包括:
支持原始類型
現(xiàn)在我們可以使用原始類型
int
long或 將列double ,并提高執(zhí)行速度和內(nèi)存使用率。 可空字段可以映射到專用字段 Optional類型,例如 OptionalInt OptionalLong和 OptionalDouble Double與Java 8代碼樣式一致。
模塊化代碼生成
我們可以插入自己的代碼生成邏輯并改編默認(rèn)代碼生成器。 這對于可能更深入地了解我們的領(lǐng)域模型并希望利用該知識的開發(fā)人員來說非常方便。 通過自定義代碼生成器添加新功能時,這些新功能將立即應(yīng)用于所有生成的代碼。 對代碼進(jìn)行編碼并獲得利用!
兼容模式
一些較舊的解決方案不準(zhǔn)備用于
Optional字段,因此添加了新的“兼容性”模式,例如,將返回一個可為空的整數(shù)作為
Integer而不是 OptionalInt 。
可配置名稱空間
現(xiàn)在,我們可以配置代碼生成器,以將實(shí)體,管理器和配置對象分別放置在任何名稱空間上。 這對模塊化項(xiàng)目很有用。
改進(jìn)的代碼渲染器
Speedment使用模型視圖控制器(MVC)范例進(jìn)行代碼生成。 這意味著代碼模型(是抽象語法樹)與實(shí)際的代碼呈現(xiàn)(視圖)是分開的。 視圖已經(jīng)更新和改進(jìn),因此它可以生成更好的代碼。
校驗(yàn)和保護(hù)
手動更改類受校驗(yàn)和保護(hù),以便即使我們決定更改名稱空間,也可以保留它們。
類型安全性提高
現(xiàn)在,Speedment可以將采用小字符串集的值的列映射到Enums,從而進(jìn)一步提高類型安全性。 當(dāng)生成的代碼使用Enum時,編譯器將盡早發(fā)現(xiàn)數(shù)據(jù)庫模型與業(yè)務(wù)邏輯中使用的值之間的任何不匹配,而不是在開發(fā)周期的后期發(fā)現(xiàn)。
改進(jìn)日志記錄以提高透明度
Speedment有一個新的日志記錄系統(tǒng),使我們可以查看發(fā)送到數(shù)據(jù)庫的確切SQL代碼。 這有利于提高透明度,并使我們能夠準(zhǔn)確地了解引擎蓋下的情況。 我們可以輕松地啟用所有CRUD操作的日志記錄,如下所示:
HaresApplication loggingApp = new HaresApplicationBuilder().withPassword("secretDbPassword").withLogging(STREAM).withLogging(PERSIST).withLogging(UPDATE).withLogging(REMOVE).build();Manager<Hare> hares = loggingApp.getOrThrow(HareManager.class);long oldHares = hares.stream().filter(Hare.AGE.greaterThan(8)).count();System.out.println("There are " + oldHares + " old hares");這將產(chǎn)生以下日志:
2016-10-19T20:50:21.957Z DEBUG [main] (#SELECT) - SELECT COUNT(*) FROM `hares`.`hare` WHERE (`hares`.`hare`.`age` > ?), values:[8]There are 30 old hares改進(jìn)的用戶界面
圖形工具已在許多方面得到改進(jìn)。 現(xiàn)在,我們得到警告和提示,可以為我們提供更好的指導(dǎo)。 添加了幾個代碼生成器配置選項(xiàng),當(dāng)我們選擇不同的配置對象時,我們還會看到更多相關(guān)信息。
新的Maven目標(biāo)
有兩個新的Maven目標(biāo); “清除”和“重新加載”,可用于自動化和簡化構(gòu)建過程。 目標(biāo)“清除”將刪除所有生成的代碼(未手動更改),并且“重新加載”直接從現(xiàn)有數(shù)據(jù)庫(元數(shù)據(jù))重新加載域模型。
旋轉(zhuǎn)一下
在GitHub上查看開放源代碼Speedment,那里還有Wiki和快速入門指南 。 隨時提供反饋,并通過Gitter參加討論。
安全駕駛!
翻譯自: https://www.javacodegeeks.com/2016/10/java-8-closer-look-speedment-3-0-1-forest-stream-orm.html
總結(jié)
以上是生活随笔為你收集整理的Java 8:对速度3.0.1“森林”流ORM的更深入了解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 投票:苹果 iPhone 15 / Pr
- 下一篇: 如果您在2016年编写过Java代码-这