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

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

高洛峰
リリース: 2016-11-04 09:22:22
オリジナル
1551 人が閲覧しました

新しいツールに触れるとき、最初に乗り越えなければならない最大の障害は、どのようにして最初に小さなものを作ってみるかということです。新しい 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上找到。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
ヘルプ: JAVA 暗号化データ PHP 復号化
から 1970-01-01 08:00:00
0
0
0
JAVAをインストールする
から 1970-01-01 08:00:00
0
0
0
Javaをインストールできません
から 1970-01-01 08:00:00
0
0
0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート