ホームページ 类库下载 java类库 Java 8 Streams でのデータベース CRUD 操作

Java 8 Streams でのデータベース CRUD 操作

Nov 04, 2016 am 09:22 AM
java

新しいツールに触れるとき、最初に乗り越えなければならない最大の障害は、どのようにして最初に小さなものを作ってみるかということです。新しい Stream API が Java 8 でどのように機能するかについては自信を持って理解できるようになりましたが、データベース クエリの実行にそれを使用したことはないかもしれません。 Stream API を使用して SQL データベースの作成、変更、読み取りを開始できるように、このクイックスタート チュートリアルにすべてをまとめました。ストリーミング API の使用法を改善するのに役立つことを願っています!

Background

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
ログイン後にコピー

これにより、データベースに接続してコード生成を構成するプロセスが表示されます。最も簡単な開始方法は、最初にデフォルト設定で実行することです。 [生成] ボタンを押すと、Speedment はデータベースのメタデータを分析し、エンティティやエンティティ マネージャーなどのクラスをプロジェクトに追加します。

Speedment の初期化

ドメイン モデルが生成されたら、Speedment をセットアップするのは簡単です。新しい Main.java ファイルを作成し、次のコード行を追加します。表示されるクラスは生成されるため、データベース スキーマ、テーブル、および列の名前に基づいて名前が付けられます。

Main.java

ublic class Main {  
public static void main(String... param) {  
final HaresApplication app = new HaresApplicationBuilder()  
.withPassword("password")  
.build();  
}  
}
ログイン後にコピー

上記のコードは、生成されたコンストラクター パターンを使用して新しいアプリケーション エンティティを作成します。コンストラクターを使用すると、データベース パスワードなどの実行時構成の詳細を設定できます。

アプリケーション エンティティを取得したら、それを使用して、生成されたエンティティ マネージャーにアクセスできます。ここでは、データベースに「hare」、「キャロット」、「human」、「friend」という 4 つのテーブルがあります (完全なデータベース定義はここにあります)。

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 メソッドは、「id」などの自動生成キーがすでに設定されている (潜在的に) Hare の新しいインスタンスを返します。永続化後も 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 の Stream API を使用してデータベース内のデータをストリーミングできる機能です。 「なぜこれがクールなのでしょうか?」と疑問に思うかもしれません。 「最近では Hibernate でもストリーミング操作がサポートされています!」というのが答えでした。

Speedment ストリーミング操作を使用する最も優れた点は、ストリーム構築の中間アクションと終了アクションの両方が考慮されることです。これは、ストリームの作成後にフィルターをストリームに追加すると、SQL ステートメントの作成時にそのフィルターも考慮されることを意味します。

これは、データベース内のウサギのレコードの総数をカウントする例です。

final long haresTotal = hares.stream().count(); 
System.out.format("There are %d hares in total.%n", haresTotal);
ログイン後にコピー

このコードが生成する SQL クエリは次のとおりです:

SELECT COUNT(id) 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()方法之前,对实体本地拷贝的改变,不会影响数据库内容。

下面,我们拿到之前使用Hare创建的Harry,并将他的颜色变为棕色:

harry.setColor("brown");  
final Hare updatedHarry = hares.update(harry);
ログイン後にコピー

如果更新被接受了,那么管理器会返回hare的一个新的拷贝,因为我们在后面会继续使用这个实例。就想做“创建”的例子中,更新可能会失败。也许颜色被定义为“值唯一”,棕色已经存在于hare中。那样的话,会抛出一个SpeedmentException异常.

我们也可以通过合并多个实体到一个流中来同时更新他们。加入我们想将所有名字为Harry的hare变为棕色,我们可以这样做:

hares.stream()  .
filter(Hare.NAME.equal("Harry")) .
map(Hare.COLOR.setTo("Brown"))  .
forEach(hares.updater()); 
// 更新流中存在的元素
ログイン後にコピー

我们还应该使用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 的 Stream API 来从数据库中创建、更新、读取以及删除实体。这是你可以利用 Speedment 所能进行的操作的一个小的子集, 但已经是一个能让你上手的好的开始了。更多的示例以及更加高级的使用场景可以在GitHub-page上找到。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

See all articles