ActiveJDBCの紹介
1. 序章
ActiveJDBCは、RubyonRailsの主要なORMであるActiveRecordのコアアイデアに従った軽量のORMです。
これは、一般的な永続性マネージャーの余分なレイヤーを削除することでデータベースとの対話を簡素化することに焦点を当て、新しいクエリ言語を作成するのではなく、SQLの使用に焦点を当てています。
さらに、DBSpecクラスを介したデータベースの相互作用の単体テストを作成する独自の方法を提供します。
このライブラリが他の一般的なJavaORMとどのように異なるか、およびその使用方法を見てみましょう。
2. ActiveJDBCと他のORM
ActiveJDBCには、他のほとんどのJavaORMと比較して大きな違いがあります。 データベースからDBスキーマパラメータを推測するため、エンティティを基になるテーブルにマッピングする必要がなくなります。
セッション、永続性マネージャー、新しいクエリ言語を学ぶ必要、ゲッター/セッターはありません。 ライブラリ自体は、サイズと依存関係の数の点で軽量です。
この実装により、テストの実行後にフレームワークによってクリーンアップされるテストデータベースの使用が促進されるため、テストデータベースの保守コストが削減されます。
ただし、モデルを作成または更新するときは常に、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およびmysqlコネクタアーティファクトの最新バージョンは、MavenCentralリポジトリーにあります。
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>
最新のactivejdbc-instrumentationプラグインは、MavenCentralにもあります。
これで、次の2つのコマンドのいずれかを実行してインストルメンテーションを処理できます。
mvn process-classes
mvn activejdbc-instrumentation:instrument
5. ActiveJDBCの使用
5.1. モデル
1行のコードで単純なモデルを作成できます。これにはModelクラスの拡張が含まれます。
ライブラリは、英語の語尾変化を使用して、名詞の複数形および単数形の変換を実現します。 これは、@Tableアノテーションを使用してオーバーライドできます。
単純なモデルがどのように見えるかを見てみましょう。
import org.javalite.activejdbc.Model;
public class Employee extends Model {}
5.2. データベースへの接続
BaseとDB–の2つのクラスがデータベースに接続するために提供されています。
データベースに接続する最も簡単な方法は次のとおりです。
Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://host/organization", "user", "xxxxx");
モデルが動作しているとき、モデルは現在のスレッドで見つかった接続を利用します。 この接続は、DB操作の前にBaseまたはDBクラスによってローカルスレッドに配置されます。
上記のアプローチにより、より簡潔なAPIが可能になり、他のJavaORMのように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の非常に基本的なことに焦点を当てて調査しました。
いつものように、この記事に関連するソースコードはGithubのにあります。