[Speedment] StreamsをつかったDBアクセスライブラリ[Java8]

2015.12.08

Java8標準機能を使用したライブラリ

Speedmentとは

Speedmentとは、「JavaでのDBアクセスを楽しく簡単に行うためのライブラリ」とのことです。
Java8標準のStreamsを使用して実装するのが特徴で、下記のようなイメージで直感的に使用することができます。

//公式サイトのサンプルのまま
List<User> youngUsers = speedment.managerOf(User.class)
  .stream()
  .filter(User.AGE.lessThan(18))
  .collect(toList());

↑のコードをみるだけでも、なんとなく使い方が想像できますね。
なお、SpeedmentにはOSS版とエンタープライズ版があり、OSS版はMySQL/MariaDBがサポートされています。(Java8以降対応)

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.10.5
  • Java : 1.8.0_51
  • MySQL : 5.6.25

Speedmentを使ってみる

1.DB環境構築

まずは環境の用意をしましょう。今回使用するDBをMySQLのコマンドラインツールで作成しておきます。

% mysql -u <ユーザー> -p
mysql > create database speedment;
mysql > use speedment;
mysql > create table User (id int not null primary key auto_increment , name varchar(100));
mysql > insert into User values(1,'taro');
mysql > insert into User values(2,'hanako');

ここではspeedmentデータベースを作成し、シンプルなUserテーブルとサンプルデータを作成しました。

2.プロジェクト作成

次に、Mavenを使用したプロジェクトを作成します。
IDEを使って作成してもいいし、archetype:generateのJavaプロジェクトを使ってもいいので、Javaのプロジェクトを作成します。
pom.xmlは下記のようにspeedmentの依存ライブラリ(とplugin)を追記しましょう。

・
・
    <!-- dependencies内 -->
    <dependency>
      <groupId>com.speedment</groupId>
      <artifactId>speedment</artifactId>
      <version>2.2.2</version>
    </dependency>
・
・

      <!-- plugins内 -->
      <plugin>
        <groupId>com.speedment</groupId>
        <artifactId>speedment-maven-plugin</artifactId>
        <version>2.2.2</version>
      </plugin>
・
・

3.GUIツールでJavaファイルの生成

Get Startedによると、GUIツールをつかってモデル等必要なファイルを生成します。
下記コマンドを実行し、GUIツールを起動しましょう。

% mvn speedment:gui

speedment-2

先ほど作成したDBにアクセスするための情報を入力し、connectボタンを押します。
下記画面でGenerate codeボタンを押すと、DBスキーマに応じて必要なJavaクラスが生成されます。

speedment-3

ちなみに、

% mvn speedment:generate

とすると、GUIツールは起動せずにJavaファイルの生成だけが実行される様子。

4.Javaファイルの実装

生成されたファイルを使用してDBアクセスしてみましょう。
まずは下記のようにSpeedmentを初期化し、Userテーブルにアクセスしてみます。

Speedment speedment = new SpeedmentApplication().build();
Manager<User> users = speedment.managerOf(User.class);

検索はこんな感じ

//NAMEがsyutaのレコードを取得
Optional<User> u = users.stream()
                .filter(User.NAME.equal("syuta"))
                .findAny();

//NAMEがsyutaでないレコード数を取得
int count = users.stream().filter(User.NAME.notEqualIgnoreCase("syuta")).count();

//NAMEがkenでないレコードにて対してSystem.out.printを実行
users.stream().filter(User.NAME.notEqualIgnoreCase("ken")).forEach(lu -> System.out.print(lu));

登録は次のように。Scannerでユーザーの入力をうけつけ、その情報を登録します。

final Scanner scn = new Scanner(System.in);
System.out.print("please input name.");
final String name = scn.nextLine();
try {
      User u = users.newInstance().setName(name).persist();
      System.out.print("Hello, " + u.getName() + "!");
    } catch (SpeedmentException e) {
            e.printStackTrace();
    }
}

とりあえず登録と検索のコードをみてみました。
もっと詳細な使い方はどっかにないかなあとおもったんですが、ドキュメントが見つからず。
Githubみるしかないのかもしれません。

まとめ

今回はJava8の標準StreamsをつかってDBのにアクセスするライブラリ、Speedmentをつかってみました。
Java7やOracleを使用している場合、エンタープライズ版を使えば対応できるようです。
ツールもいろいろそろっており、なかなかおもしろいライブラリですね。

参考サイトなど