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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java 8流中的数据库CRUD操作

發(fā)布時(shí)間:2023/12/3 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 8流中的数据库CRUD操作 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在開始使用新工具時(shí)要克服的最大障礙是讓您著手處理小事情。 到目前為止,您可能對(duì)新的Java 8 Stream API的工作方式充滿信心,但是您可能尚未將其用于數(shù)據(jù)庫(kù)查詢。 為了幫助您開始使用Stream API創(chuàng)建,修改和讀取SQL數(shù)據(jù)庫(kù),我整理了此快速入門。 希望它可以幫助您將信息流提升到一個(gè)新的水平!

背景

Speedment是一個(gè)開源工具包 ,可用于生成Java實(shí)體和管理器以與數(shù)據(jù)庫(kù)進(jìn)行通信。 使用圖形工具,您可以連接到數(shù)據(jù)庫(kù)并生成一個(gè)完整的ORM,量身定制以代表您的域模型。 但是Speedment不僅是代碼生成器,而且還是插入您的應(yīng)用程序的運(yùn)行時(shí),并可以將Java 8流轉(zhuǎn)換為優(yōu)化的SQL查詢。 這是我將在本文中重點(diǎn)介紹的部分。

產(chǎn)生程式碼

要開始在Maven項(xiàng)目中使用Speedment,請(qǐng)將以下行添加到pom.xml文件中。 在此示例中,我使用的是MySQL,但您也可以使用PostgreSQL或MariaDB。 企業(yè)客戶可以使用Oracle等專有數(shù)據(jù)庫(kù)的連接器。

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>

現(xiàn)在,您可以訪問(wèn)許多新的Maven目標(biāo),這些目標(biāo)使使用工具包變得更加容易。 啟動(dòng)Speedment UI,執(zhí)行:

mvn speedment:tool

這將指導(dǎo)您完成連接數(shù)據(jù)庫(kù)和配置代碼生成的過(guò)程。 開始時(shí)最簡(jiǎn)單的方法就是您與默認(rèn)設(shè)置一起運(yùn)行。 一旦按下“ Generate”,Speedment將分析您的數(shù)據(jù)庫(kù)元數(shù)據(jù),并用諸如實(shí)體和經(jīng)理類之類的新資源填充您的項(xiàng)目。

初始化速度

生成域模型后,輕松設(shè)置Speedment。 創(chuàng)建一個(gè)新的Main.java文件并添加以下行。 您看到的所有類都是生成的,因此它們的名稱將取決于數(shù)據(jù)庫(kù)模式,表和列的名稱。

Main.java

public class Main {public static void main(String... param) {final HaresApplication app = new HaresApplicationBuilder().withPassword("password").build();} }

上面的代碼使用生成的生成器模式創(chuàng)建一個(gè)新的應(yīng)用程序?qū)嵗?使用該構(gòu)建器可以設(shè)置任何運(yùn)行時(shí)配置詳細(xì)信息,例如數(shù)據(jù)庫(kù)密碼。

有了應(yīng)用程序?qū)嵗?#xff0c;就可以使用它來(lái)訪問(wèn)生成的管理器。 在這種情況下,數(shù)據(jù)庫(kù)中有四個(gè)表。 “野兔”,“胡蘿卜”,“人”和“朋友”。 (您可以在此處查看整個(gè)數(shù)據(jù)庫(kù)定義 )。

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);

這些管理器現(xiàn)在可以用來(lái)執(zhí)行我們的所有CRUD操作。

創(chuàng)建實(shí)體

創(chuàng)建實(shí)體非常簡(jiǎn)單。 我們使用生成的實(shí)體實(shí)現(xiàn),為列設(shè)置所需的值,然后將其持久化到數(shù)據(jù)源。

hares.persist(new HareImpl().setName("Harry").setColor("Gray").setAge(8) );

persist方法返回一個(gè)(可能)新的Hare實(shí)例,其中已設(shè)置了自動(dòng)生成的鍵(例如“ id”)。 如果我們要在持久化Harry后再使用Harry,則應(yīng)使用由persist返回的實(shí)例。

final Hare harry = hares.persist(new HareImpl().setName("Harry").setColor("Gray").setAge(8) );

如果持久性失敗(例如,如果外鍵或唯一約束失敗),則拋出SpeedmentException。 如果有什么阻止我們堅(jiān)持野兔,我們應(yīng)該檢查并顯示錯(cuò)誤。

try {final Hare harry = hares.persist(new HareImpl().setName("Harry").setColor("Gray").setAge(8)); } catch (final SpeedmentException ex) {System.err.println(ex.getMessage());return; }

讀取實(shí)體

Speedment運(yùn)行時(shí)中最酷的功能是可以使用Java 8 Streams流化數(shù)據(jù)庫(kù)中的數(shù)據(jù)。 “為什么這么酷?” 你可能會(huì)問(wèn)自己。 “如今,即使Hibernate也支持流 !”

Speedment流的美麗之處在于,在構(gòu)造流時(shí),它們考慮了中介和終止操作。 這意味著,如果在創(chuàng)建流之后向該流添加過(guò)濾器,則在構(gòu)建SQL語(yǔ)句時(shí)仍將其考慮在內(nèi)。

這是一個(gè)例子。 我們要計(jì)算數(shù)據(jù)庫(kù)中的野兔總數(shù)。

final long haresTotal = hares.stream().count(); System.out.format("There are %d hares in total.%n", haresTotal);

將生成的SQL查詢?nèi)缦?#xff1a;

SELECT COUNT(*) FROM hares.hare;

終止操作是.count(),因此Speedment知道它是要?jiǎng)?chuàng)建的SELECT COUNT(…)語(yǔ)句。 還知道“ hare”表的主鍵是“ id”列,這使得將發(fā)送給數(shù)據(jù)庫(kù)的整個(gè)語(yǔ)句縮減到此范圍內(nèi)成為可能。

一個(gè)更復(fù)雜的示例可能是查找名稱以字母“ rry”結(jié)尾且年齡大于或等于5的野兔數(shù)量??梢赃@樣寫:

final long complexTotal = hares.stream().filter(Hare.NAME.endsWith("rry")).filter(Hare.AGE.greaterOrEqual(5)).count();

我們使用Speedment為我們生成的謂詞構(gòu)建器來(lái)定義過(guò)濾器。 這使我們可以以編程方式分析流并將其簡(jiǎn)化為以下SQL語(yǔ)句:

SELECT COUNT(id) FROM hares.hare WHERE hare.name LIKE CONCAT("%", ?) AND hare.age >= 5;

如果我們向流添加無(wú)法優(yōu)化Speedment的操作,它將像任何Java 8流一樣被解析。 我們絕不僅限于使用生成的謂詞構(gòu)建器,它只是使流更有效。

final long inefficientTotal = hares.stream().filter(h -> h.getName().hashCode() == 52).count();

這將產(chǎn)生以下效率極低的語(yǔ)句,但仍將起作用。

SELECT id,name,color,age FROM hares.hare;

更新實(shí)體

更新現(xiàn)有實(shí)體的方式與讀取和保留實(shí)體的方式非常相似。 在我們?cè)诠芾砥髦姓{(diào)用update()方法之前,對(duì)實(shí)體的本地副本所做的更改不會(huì)影響數(shù)據(jù)庫(kù)。

在這種情況下,我們采用了哈利先前創(chuàng)建的野兔,并希望將其顏色更改為棕色:

harry.setColor("brown"); final Hare updatedHarry = hares.update(harry);

如果更新被接受,管理員將返回新的野兔副本,因此在此之后我們應(yīng)該繼續(xù)使用該實(shí)例。 就像在“創(chuàng)建”示例中一樣,更新可能會(huì)失敗。 也許將顏色定義為“唯一”列,并且已經(jīng)存在“棕色”兔子。 在這種情況下,將拋出SpeedmentException。

我們還可以通過(guò)將其與流組合來(lái)同時(shí)更新多個(gè)實(shí)體。 假設(shè)我們要將所有名為“哈利”的野兔都變成棕色。 在這種情況下,我們這樣做:

hares.stream().filter(Hare.NAME.equal("Harry")).map(Hare.COLOR.setTo("Brown")).forEach(hares.updater()); // Updates remaining elements in the Stream

我們還應(yīng)該將其包裝在try-catch中,以確保在約束失敗時(shí)向用戶發(fā)出警告。

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; }

移除實(shí)體

我們需要知道的最后一個(gè)CRUD操作是如何從數(shù)據(jù)庫(kù)中刪除實(shí)體。 這幾乎與“更新”相同。 假設(shè)我們要?jiǎng)h除所有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; }

摘要

在本文中,您學(xué)習(xí)了如何在Maven項(xiàng)目中設(shè)置Speedment,以及如何使用Java 8 Streams從數(shù)據(jù)庫(kù)創(chuàng)建,更新,讀取和刪除實(shí)體。 這只是Speedment可以做的所有事情的一小部分,但是它是開始弄臟雙手的很好的介紹。 可以在GitHub-page上找到更多示例和更高級(jí)的用例。

直到下一次!

翻譯自: https://www.javacodegeeks.com/2016/10/database-crud-operations-java-8-streams.html

總結(jié)

以上是生活随笔為你收集整理的Java 8流中的数据库CRUD操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。