ActiveJDBCの紹介

ActiveJDBCの概要

1. 前書き

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

新しいクエリ言語を作成するのではなく、simplifying the interaction with databases by removing the extra layer of typical persistence managersに焦点を当て、SQLの使用法に焦点を当てています。

さらに、DBSpecクラスを介したデータベースの相互作用の単体テストを作成する独自の方法を提供します。

このライブラリが他の一般的なJavaORMとどのように異なるか、およびその使用方法を見てみましょう。

2. ActiveJDBCと他のORM

ActiveJDBCには、他のほとんどのJava ORMと比べて大きな違いがあります。 It infers the DB schema parameters from a database, thus removing the need for mapping entities to underlying tables.

No sessions, no persistence managers、新しいクエリ言語を学ぶ必要はなく、ゲッター/セッターもありません。 ライブラリ自体は、サイズと依存関係の数の点で軽いです。

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

ただし、モデルを作成または更新するときは常に、instrumentationの少し余分なステップが必要です。 これについては、次のセクションで説明します。

3. デザイン原則

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

  • コンベンションベースの構成

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

  • 軽量モデル、単純なPOJO

  • プロキシなし

  • 貧血領域モデルの回避

  • DAOとDTOは不要

4. ライブラリのセットアップ

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


    org.javalite
    activejdbc
    1.4.13


    mysql
    mysql-connector-java
    5.1.34

activejdbcおよびmysql connectorアーティファクトの最新バージョンは、MavenCentralリポジトリーにあります。

Instrumentationは単純化の価格であり、ActiveJDBCプロジェクトで作業するときに必要です。

プロジェクトで構成する必要のあるインストルメンテーションプラグインがあります。


    org.javalite
    activejdbc-instrumentation
    1.4.13
    
        
            process-classes
            
                instrument
            
        
    

最新のactivejdbc-instrumentationプラグインは、MavenCentralにもあります。

そして、次の2つのコマンドのいずれかを実行することにより、インストルメンテーションを処理できます。

mvn process-classes
mvn activejdbc-instrumentation:instrument

5. ActiveJDBCを使用する

5.1. モデル

1行のコードで単純なモデルを作成できます。これにはModelクラスの拡張が含まれます。

ライブラリは、英語のinflectionsを使用して、名詞の複数形および単数形の変換を実現します。 これは、@Tableアノテーションを使用してオーバーライドできます。

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

import org.javalite.activejdbc.Model;

public class Employee extends Model {}

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

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

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

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

データベースへの接続にBaseDBがどのように異なる方法で使用されているかを見ると、単一のデータベースで操作する場合は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();

または、流fluentに:

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 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の非常に基本的なことに焦点を当てて検討しました。

いつものように、この記事に関連するソースコードはover on Githubにあります。