Java8中應用流方法查詢數據庫的辦法。本站提示廣大學習愛好者:(Java8中應用流方法查詢數據庫的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是Java8中應用流方法查詢數據庫的辦法正文
因為關系型數據庫操作說話和面向對象說話之間的差別,現在我們依然須要消費很多時光樹立數據庫與 Java 運用之間相互溝通的橋梁。平日,我們可以編寫本身的映照層(mapping layer),或許應用第三方的 ORM(Object Relational Mapper)對象關系映照框架,好比 Hibernate。ORM 框架固然應用起來很便利,然則若何准確地設置裝備擺設和進步框架操作數據庫的機能卻不太輕易,ORM 框架常常會使我們的運用機能降低。 比來,我進獻了一個新的開源項目——Speedment,它能使我們應用 Java 8 開辟數據庫運用法式變得更加快捷和高效。
Speedment 是應用 ORM 方法操作數據庫的一種選擇,之前我們須要100行操作數據庫的 Java 代碼,在 Java 8中,能夠只須要一行代碼。
在90年月末,我應用 Java 開辟數據庫運用的時刻,很多代碼邏輯都須要本身來編寫,好比捕捉異常、類型轉換等,經由很多修改,最初這些代碼變得難以保護和擴大。
因為關系型數據庫操作說話和面向對象說話之間的差別,現在我們依然須要消費很多時光樹立數據庫與 Java 運用之間相互溝通的橋梁。平日,我們可以編寫本身的映照層(mapping layer),或許應用第三方的 ORM(Object Relational Mapper)對象關系映照框架,好比 Hibernate。ORM 框架固然應用起來很便利,然則若何准確地設置裝備擺設和進步框架操作數據庫的機能卻不太輕易,ORM 框架常常會使我們的運用機能降低。
比來,我進獻了一個新的開源項目——Speedment,它能使我們應用 Java 8 開辟數據庫運用法式變得更加快捷和高效。
Speedment 是甚麼?
Speedment 是一個開源項目,它是一個基於 Java 8 的新特征開辟的新的 Java 庫,從這個項目開辟開端,它的代碼就全體應用 Java 8來編寫。Speedment 應用尺度流查詢數據庫,這使得開辟者不須要進修任何新的查詢 API ,和不用斟酌 JDBC 、ResultSet 和其他有關數據庫的指定的操作。
Speedment 會依據現稀有據庫來主動生成代碼。因為它的這類方法,開辟者不須要編寫一行關於數據庫實體(database entities)的代碼。它生成的代碼中也包括 JavaDocs 贊助文檔,這使開辟者不須要編寫關於 User 或許 Book 等對象的實體類。取而代之地,我們只須要創立或許應用一個現有的數據庫,然後用 Speedment 去銜接它,接著 Speedment 會剖析數據庫構造來生成實體類的代碼。
更風趣的是,Speedment 用野兔來作為它的祥瑞物。 在接上去的例子中,我們會應用一個名為 “hare” 的數據庫來給年夜家演示 Speedment 的應用方法。該數據庫的表構造以下:
mysql> explain hare;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(45) | NO | | NULL | |
| color | varchar(45) | NO | | NULL | |
| age | int(11) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
上面是 Speedment 依據數據庫信息生成的一個響應的實體類(為簡練起見,我們將 JavaDocs 在這裡移除):
public interface Hare extends Entity<Hare> { public final static ReferenceComparableField<Hare, Integer> ID = new ReferenceComparableFieldImpl<>("id", Hare::getId, Hare::setId); public final static ReferenceComparableStringField<Hare> NAME = new ReferenceComparableStringFieldImpl<>("name", Hare::getName, Hare::setName); public final static ReferenceComparableStringField<Hare> COLOR = new ReferenceComparableStringFieldImpl<>("color", Hare::getColor, Hare::setColor); public final static ReferenceComparableField<Hare, Integer> AGE = new ReferenceComparableFieldImpl<>("age", Hare::getAge, Hare::setAge); Integer getId(); String getName(); String getColor(); Integer getAge(); Hare setId(Integer id); Hare setName(String name); Hare setColor(String color); Hare setAge(Integer age); /** Graph-like traversal methods eliminating JOINs */ Stream<Carrot> findCarrotsByOwner(); Stream<Carrot> findCarrotsByRival(); Stream<Carrot> findCarrots(); }
我將用一篇零丁的文章引見 find*() 辦法的用法,它可以被用來取代 SQL joins 操作。
Queries查詢示例
上面的例子展現若何查詢 Hare 表的數據庫信息:
List<Hare> oldHares = hares.stream()
.filter(AGE.greaterThan(8))
.collect(toList());
智能流
下面的代碼看起來曾經遍歷了 hare 數據庫表的一切行,但現實上其實不是如許的。 Stream 是智能的,當它達到 collect() 操作的時刻,會剖析 filter 操作,並揣摸出 hare.age 年夜於8的列,是以會節儉 hares 的流操作,發生與 “select * from hare where age > 8” 操作一樣的後果。假如你應用了多個 filters,他們會被歸並起來以節儉流操作。上面是另外一種用流方法停止多個操作的例子:
long noOldHares = hares.stream()
.filter(AGE.greaterThan(8))
.mapToInt(Hare::getAge)
.sorted()
.count();
在下面的代碼中,當流達到 count() 操作時,它將檢討它本身的管道。起首會揣摸下面例子中的 AGE 操作,其次在不轉變 count() 成果的情形下,會揣摸 mapToInt() 和 sorted() 操作,這些操作可以被清除,是以這段代碼的操作被節儉為 “select count(*) from hare where age > 8”。這意味著您可使用 Java 8 流而你不用如斯在乎流是若何轉換為SQL的。
若何下載和參加我們
假如你想進修若何應用 Speedment 的 API 和在項目中若何應用 Speedment,可以拜訪網址 www.speedment.org,並可以在 gitter 上揭橥評論,也能夠從 GitHub 高低載 Speedment 的源碼,來進獻你本身的代碼。
總結
回想晚期的一些老項目,一個跨越100行代碼的數據庫類,如今可使用 Java 8 縮減成1行代碼。那是反轉後的摩爾定律,在14年內(=7摩爾周期),行數年夜約減半了七次。這就是提高!
甚麼是數據流
流代表從支撐聚合操作源的序列的對象。以下是數據流的特色。
元素序列 - 流供給了一組特定類型的以次序方法元素。流獲得/盤算需求的元素。它不存儲元素。
源- 流應用聚集,數組或I/O資本為輸出源。
聚合操作 - 數據流支撐如filter, map, limit, reduced, find, match等聚合操作。
管道傳輸 - 年夜多半流操作的前往流自己使他們的成果可以被管道傳輸。這些操作被稱為中央操作和它們的功效是應用輸出,處置輸出和輸入前往到目的。collect()辦法是終端操作,這是平日湧現在管道傳輸操作停止標志流的停止。
主動迭代 - 流操作外部做了重復比較,個中明白迭代須要聚集供給源元素。