Java 8流中的数据库CRUD操作
在開始使用新工具時要克服的最大障礙是讓您著手處理小事情。 到目前為止,您可能對新的Java 8 Stream API的工作方式充滿信心,但是您可能尚未將其用于數據庫查詢。 為了幫助您開始使用Stream API創建,修改和讀取SQL數據庫,我整理了此快速入門。 希望它可以幫助您將信息流提升到一個新的水平!
背景
Speedment是一個開源工具包 ,可用于生成Java實體和管理器以與數據庫進行通信。 使用圖形工具,您可以連接到數據庫并生成一個完整的ORM,量身定制以代表您的域模型。 但是Speedment不僅是代碼生成器,而且還是插入您的應用程序的運行時,并可以將Java 8流轉換為優化的SQL查詢。 這是我將在本文中重點介紹的部分。
產生程式碼
要開始在Maven項目中使用Speedment,請將以下行添加到pom.xml文件中。 在此示例中,我使用的是MySQL,但您也可以使用PostgreSQL或MariaDB。 企業客戶可以使用Oracle等專有數據庫的連接器。
pom.xml
<properties><speedment.version>3.0.1</speedment.version><db.groupId>mysql</db.groupId><db.artifactId>mysql-connector-java</db.artifactId><db.version>5.1.39</db.version> </properties><dependencies><dependency><groupId>com.speedment</groupId><artifactId>runtime</artifactId><version>${speedment.version}</version><type>pom</type></dependency><dependency><groupId>${db.groupId}</groupId><artifactId>${db.artifactId}</artifactId><version>${db.version}</version></dependency> </dependencies><build><plugins><plugin><groupId>com.speedment</groupId><artifactId>speedment-maven-plugin</artifactId><version>${speedment.version}</version><dependencies><dependency><groupId>${db.groupId}</groupId><artifactId>${db.artifactId}</artifactId><version>${db.version}</version></dependency></dependencies></plugin></plugins> </build>現在,您可以訪問許多新的Maven目標,這些目標使使用工具包變得更加容易。 啟動Speedment UI,執行:
mvn speedment:tool這將指導您完成連接數據庫和配置代碼生成的過程。 開始時最簡單的方法就是您與默認設置一起運行。 一旦按下“ Generate”,Speedment將分析您的數據庫元數據,并用諸如實體和經理類之類的新資源填充您的項目。
初始化速度
生成域模型后,輕松設置Speedment。 創建一個新的Main.java文件并添加以下行。 您看到的所有類都是生成的,因此它們的名稱將取決于數據庫模式,表和列的名稱。
Main.java
public class Main {public static void main(String... param) {final HaresApplication app = new HaresApplicationBuilder().withPassword("password").build();} }上面的代碼使用生成的生成器模式創建一個新的應用程序實例。 使用該構建器可以設置任何運行時配置詳細信息,例如數據庫密碼。
有了應用程序實例后,就可以使用它來訪問生成的管理器。 在這種情況下,數據庫中有四個表。 “野兔”,“胡蘿卜”,“人”和“朋友”。 (您可以在此處查看整個數據庫定義 )。
final CarrotManager carrots = app.getOrThrow(CarrotManager.class); final HareManager hares = app.getOrThrow(HareManager.class); final HumanManager humans = app.getOrThrow(HumanManager.class); final FriendManager hares = app.getOrThrow(FriendManager.class);這些管理器現在可以用來執行我們的所有CRUD操作。
創建實體
創建實體非常簡單。 我們使用生成的實體實現,為列設置所需的值,然后將其持久化到數據源。
hares.persist(new HareImpl().setName("Harry").setColor("Gray").setAge(8) );persist方法返回一個(可能)新的Hare實例,其中已設置了自動生成的鍵(例如“ id”)。 如果我們要在持久化Harry后再使用Harry,則應使用由persist返回的實例。
final Hare harry = hares.persist(new HareImpl().setName("Harry").setColor("Gray").setAge(8) );如果持久性失敗(例如,如果外鍵或唯一約束失敗),則拋出SpeedmentException。 如果有什么阻止我們堅持野兔,我們應該檢查并顯示錯誤。
try {final Hare harry = hares.persist(new HareImpl().setName("Harry").setColor("Gray").setAge(8)); } catch (final SpeedmentException ex) {System.err.println(ex.getMessage());return; }讀取實體
Speedment運行時中最酷的功能是可以使用Java 8 Streams流化數據庫中的數據。 “為什么這么酷?” 你可能會問自己。 “如今,即使Hibernate也支持流 !”
Speedment流的美麗之處在于,在構造流時,它們考慮了中介和終止操作。 這意味著,如果在創建流之后向該流添加過濾器,則在構建SQL語句時仍將其考慮在內。
這是一個例子。 我們要計算數據庫中的野兔總數。
final long haresTotal = hares.stream().count(); System.out.format("There are %d hares in total.%n", haresTotal);將生成的SQL查詢如下:
SELECT COUNT(*) FROM hares.hare;終止操作是.count(),因此Speedment知道它是要創建的SELECT COUNT(…)語句。 還知道“ hare”表的主鍵是“ id”列,這使得將發送給數據庫的整個語句縮減到此范圍內成為可能。
一個更復雜的示例可能是查找名稱以字母“ rry”結尾且年齡大于或等于5的野兔數量。可以這樣寫:
final long complexTotal = hares.stream().filter(Hare.NAME.endsWith("rry")).filter(Hare.AGE.greaterOrEqual(5)).count();我們使用Speedment為我們生成的謂詞構建器來定義過濾器。 這使我們可以以編程方式分析流并將其簡化為以下SQL語句:
SELECT COUNT(id) FROM hares.hare WHERE hare.name LIKE CONCAT("%", ?) AND hare.age >= 5;如果我們向流添加無法優化Speedment的操作,它將像任何Java 8流一樣被解析。 我們絕不僅限于使用生成的謂詞構建器,它只是使流更有效。
final long inefficientTotal = hares.stream().filter(h -> h.getName().hashCode() == 52).count();這將產生以下效率極低的語句,但仍將起作用。
SELECT id,name,color,age FROM hares.hare;更新實體
更新現有實體的方式與讀取和保留實體的方式非常相似。 在我們在管理器中調用update()方法之前,對實體的本地副本所做的更改不會影響數據庫。
在這種情況下,我們采用了哈利先前創建的野兔,并希望將其顏色更改為棕色:
harry.setColor("brown"); final Hare updatedHarry = hares.update(harry);如果更新被接受,管理員將返回新的野兔副本,因此在此之后我們應該繼續使用該實例。 就像在“創建”示例中一樣,更新可能會失敗。 也許將顏色定義為“唯一”列,并且已經存在“棕色”兔子。 在這種情況下,將拋出SpeedmentException。
我們還可以通過將其與流組合來同時更新多個實體。 假設我們要將所有名為“哈利”的野兔都變成棕色。 在這種情況下,我們這樣做:
hares.stream().filter(Hare.NAME.equal("Harry")).map(Hare.COLOR.setTo("Brown")).forEach(hares.updater()); // Updates remaining elements in the Stream我們還應該將其包裝在try-catch中,以確保在約束失敗時向用戶發出警告。
try {hares.stream().filter(Hare.NAME.equal("Harry")).map(Hare.COLOR.setTo("Brown")).forEach(hares.updater()); } catch (final SpeedmentException ex) {System.err.println(ex.getMessage());return; }移除實體
我們需要知道的最后一個CRUD操作是如何從數據庫中刪除實體。 這幾乎與“更新”相同。 假設我們要刪除所有10年以上的野兔。 然后,我們這樣做:
try {hares.stream().filter(Hare.AGE.greaterThan(10)).forEach(hares.remover()); // Removes remaining hares } catch (final SpeedmentException ex) {System.err.println(ex.getMessage());return; }摘要
在本文中,您學習了如何在Maven項目中設置Speedment,以及如何使用Java 8 Streams從數據庫創建,更新,讀取和刪除實體。 這只是Speedment可以做的所有事情的一小部分,但是它是開始弄臟雙手的很好的介紹。 可以在GitHub-page上找到更多示例和更高級的用例。
直到下一次!
翻譯自: https://www.javacodegeeks.com/2016/10/database-crud-operations-java-8-streams.html
總結
以上是生活随笔為你收集整理的Java 8流中的数据库CRUD操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7电脑麦不能说话(win7笔记本电
- 下一篇: 换新电脑系统如何卸载软件(换新电脑系统如