ActiveJDBCの紹介

1.はじめに

ActiveJDBCは、Ruby on Railsの主要なORMである ActiveRecord のコアとなるアイデアに従った軽量のORMです。

それは、典型的な永続マネージャの余分なレイヤを削除することでデータベースとのやり取りを単純化することに焦点を合わせ、新しいクエリ言語を作成するのではなくSQLの使用に焦点を合わせます。

さらに、それは DBSpec クラスを通してデータベース相互作用のためのユニットテストを書く独自の方法を提供します。

このライブラリが他の一般的なJava ORMとどのように違うのか、そしてその使い方を見てみましょう。

2. ActiveJDBCと他のORMの比較

ActiveJDBCには、他のほとんどのJava ORMと比べて大きな違いがあります。データベースからDBスキーマパラメータを推測するため、エンティティを基礎となるテーブルにマッピングする必要がなくなります。

  • セッションなし、永続性マネージャなし** 、新しいクエリ言語の習得、ゲッター/セッターなし。ライブラリ自体は、サイズと依存関係の数の点で軽量です。

この実装は、テストを実行した後にフレームワークによってクリーンアップされるテストデータベースの使用を奨励し、テストデータベースを維持するためのコストを削減します。

ただし、モデルを作成または更新するたびに、http://javalite.io/instrumentation[instrumentation]という少し余分な手順が必要です。これについては次のセクションで説明します。

3.デザイン原則

  • DBからメタデータを推測する

  • コンベンションベースの設定

  • セッションなし、「アタッチ、再アタッチ」なし

  • 軽量モデル、シンプルPOJO

  • プロキシなし

貧血ドメインモデルの回避

  • DAOやDTOは不要

4.図書館の設置

MySQLデータベースを操作するための典型的なMavenの設定には以下が含まれます。

<dependency>
    <groupId>org.javalite</groupId>
    <artifactId>activejdbc</artifactId>
    <version>1.4.13</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.34</version>
</dependency>

activejdbc およびhttps://の最新バージョンsearch.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22mysql%22%20AND%20a%3A%22mysql-connector-java%22[mysql connector]アーティファクトはMaven Centralリポジトリーにあります。

  • Instrumentation は簡素化の代償であり、ActiveJDBCプロジェクトを扱うときに必要です。

プロジェクトに設定する必要があるインストルメンテーションプラグインがあります。

<plugin>
    <groupId>org.javalite</groupId>
    <artifactId>activejdbc-instrumentation</artifactId>
    <version>1.4.13</version>
    <executions>
        <execution>
            <phase>process-classes</phase>
            <goals>
                <goal>instrument</goal>
            </goals>
        </execution>
    </executions>
</plugin>

最新のhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.javalite%22%20AND%20a%3A%22activejdbc-instrumentation%22[activejdbc-instrumentation]プラグインも可能Maven Centralで見つけることができます。

そして今、私たちはこれら二つのコマンドのうちの一つをすることによって計装を処理することができます:

mvn process-classes
mvn activejdbc-instrumentation:instrument

5. ActiveJDBCを使う

5.1. モデル

1行のコードで簡単なモデルを作成できます - それは Model クラスを拡張することを含みます。

このライブラリは、英語のhttp://javalite.io/english inflections[inflections]を使用して、複数形および単数形の名詞の変換を実現します。これは @ Table__アノテーションを使って上書きすることができます。

単純なモデルがどのように見えるかを見てみましょう。

import org.javalite.activejdbc.Model;

public class Employee extends Model {}

5.2. データベースへの接続

データベースに接続するための2つのクラス Base DB – が提供されています

データベースに接続する最も簡単な方法は次のとおりです。

Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://host/organization", "user", "xxxxx");

モデルが動作しているとき、それらは現在のスレッドで見つかった接続を利用します。この接続は、DB操作の前に Base または DB クラスによってローカルスレッドに行われます。

上記のアプローチにより、より簡潔なAPIが可能になり、他のJava ORMのようにDBセッションマネージャまたは持続マネージャの必要性がなくなります。

DB クラスを使用してデータベースに接続する方法を見てみましょう _: _

new DB("default").open(
  "com.mysql.jdbc.Driver",
  "jdbc:mysql://localhost/dbname",
  "root",
  "XXXXXX");

データベースへの接続に Base DB がどのように異なるように使用されているかを見てみると、単一のデータベースを操作する場合は Base を使用し、複数のデータベースを使用する場合は DB を使用する必要があります。

5.3. レコードを挿入する

データベースにレコードを追加するのはとても簡単です。前述のように、セッターやゲッターは必要ありません。

Employee e = new Employee();
e.set("first__name", "Hugo");
e.set("last__name", "Choi");
e.saveIt();

あるいは、この方法で同じレコードを追加することもできます。

Employee employee = new Employee("Hugo","Choi");
employee.saveIt();

あるいは流暢に

new Employee()
 .set("first__name", "Hugo", "last__name", "Choi")
 .saveIt();

5.4. レコードを更新する

以下のスニペットは、レコードを更新する方法を示しています。

Employee employee = Employee.findFirst("first__name = ?", "Hugo");
employee
  .set("last__name","Choi")
  .saveIt();

5.5. レコードを削除する

Employee e = Employee.findFirst("first__name = ?", "Hugo");
e.delete();

すべてのレコードを削除する必要がある場合

Employee.deleteAll();

子テーブルにカスケードするマスターテーブルからレコードを削除したい場合は、 deleteCascade を使用します。

Employee employee = Employee.findFirst("first__name = ?","Hugo");
employee.deleteCascade();

5.6. レコードを取得する

データベースから単一のレコードを取得しましょう。

Employee e = Employee.findFirst("first__name = ?", "Hugo");

複数のレコードを取得したい場合は、 where メソッドを使用できます。

List<Employee> employees = Employee.where("first__name = ?", "Hugo");

6.トランザクションサポート

Java ORMでは、明示的な接続またはマネージャオブジェクト(JPAのEntityManager、HibernateのSessionManagerなど)があります。 ActiveJDBCにはそのようなことはありません。

Base.open()呼び出しは接続を開き、それを現在のスレッドに結び付けます。したがって、すべてのモデルの後続のメソッドはすべてこの接続を再利用します。 Base.close()呼び出しは、接続を閉じて現在のスレッドから削除します。

トランザクションを管理するために、いくつかの便利な呼び出しがあります。

トランザクションを開始する

Base.openTransaction();

トランザクションをコミットする

Base.commitTransaction();

トランザクションをロールバックします。

Base.rollbackTransaction();

7.サポートされているデータベース

最新版はSQLServer、MySQL、Oracle、PostgreSQL、H2、SQLite3、DB2などのデータベースをサポートします。

8.まとめ

この簡単なチュートリアルでは、ActiveJDBCの基本について説明しました。

いつものように、この記事に関連するソースコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/activejdbc[over Github]にあります。