Apache DB Project – torque
torqueとは
O/Rデータベースマッピングフレームワーク
オブジェクト指向とリレーショナルデータベースを用いてシステムを開発すると、インピーダンス・ミスマッチ(Impedance Mismatch)と呼ばれるギャップが発生する。これはオブジェクト指向とリレーショナルデータベースとの考え方が異なるためである。
O/Rマッピングフレームワークとは、このギャップを軽減するためのフレームワークのことで、O/RのOはオブジェクト、Rはリレーショナルを意味している。
torqueの特徴
- 各種定義ファイルの相互自動生成。
- 基本的なデータベースアクセスクラスの自動生成。
- 自動生成したクラスの拡張化サポート。
- 多くのデータベースプロダクトに対応。
多くのデータベースプロダクトに対応。
いろいろな種類のデータベースに対応している。
直接対応していないデータベースに対しても、アダプタクラスを作成することで対応することが可能。
各種定義ファイルの相互自動生成。
Torqueでは、XMLファイルやSQL文などを利用した各種処理の自動化を実現している。
強く密接している定義ファイルは、片方のファイルからもう一方のファイルを自動生成できるような開発者の負荷を軽減するような機能がサポートされている。
基本的なデータベースアクセスクラスの自動生成。、自動生成したクラスの拡張化サポート。
Torqueはひとつのテーブルに対して4つのクラスを自動生成する。
それら4つのクラスを分類すると、テーブルの行を表すObject Modelクラスと、SQLがラップされているAssociated SQLクラスとなる。
Object ModelクラスとAssociated SQLクラスは共に、基底クラスとそれを継承するクラスのペアになっている。
基底クラスはテーブルに対する基本的な操作が実装されており、開発者が直接編集することは推奨されていない。
基底クラスの操作を拡張した処理を実現したいときは、継承クラスに処理を記述することになる。
単一テーブルに対する操作
検索
Criteria criteria = new Criteria(); List list = HumanPeer.doSelect(criteria); System.out.println(list.size());
org.apache.torque.util.Criteriaクラスに様々な条件を設定することで、いろいろなアプローチで問い合わせを実行することができる(後述)
挿入
Human human = new Human();
human.setId("99");
human.setName("xyz");
HumanPeer.doInsert(human);
更新
Human human = new Human();
human.setId("99");
human.setName("wxyz");
HumanPeer.doUpdate(human);
削除
Human human = new Human();
human.setId("99");
HumanPeer.doDelete(human);
Criteriaを利用した様々な検索
処理の基本的な流れ。
Criteria criteria = new Criteria(); criteria.add(条件); EmpPeer.doSelect(criteria);
比較
where empid = ‘xxx’
criteria.add(EmpPeer.EMPID, (Object)"xxx", Criteria.EQUAL);
where empid <> ‘xxx’
criteria.add(EmpPeer.EMPID, (Object)"xxx", Criteria.NOT_EQUAL);
where empid < 999
criteria.add(EmpPeer.EMPID, (Object)"999", LESS_THAN);
where empid > 999
criteria.add(EmpPeer.EMPID, (Object)"999", GREATER_THAN);
where empid <= 999
criteria.add(EmpPeer.EMPID, (Object)"999", Criteria.LESS_EQUAL);
where empid >= 999
criteria.add(EmpPeer.EMPID, (Object)"999", Criteria.GREATER_EQUAL);
where empid is null
criteria.add(EmPeerp.EMPID, Criteria.ISNULL);
where empid is not null
criteria.add(EmpPeer.EMPID, Criteria.ISNOTNULL);
where empid like ‘%xxx’
criteria.add(EmpPeer.EMPID, (Object)"%xxx", Criteria.LIKE);
where empid in (’0′, ’1′)
criteria.add(EmpPeer.EMPID, (Object)new String[]{"0", "1"}, Criteria.IN);
Criteria.CUSTOMを利用することで、部分的な記述を行うこともできる。
where empid between ’0′ and ’1′
criteria.add(Emp.EMPID, (Object)(EmpPeer.EMPID + " BETWEEN '0' AND '1'"), Criteria.CUSTOM);
結合(Join)
// select emp.*, dept.* 〜 EmpPeer.addSelectColumns(criteria); DeptPeer.addSelectColumns(criteria); // where emp.empid = dept.empid criteria.addJoin(EmpPeer.EMPID, DeptPeer.EMPID);
Torqueは外部結合には未対応。
ソート
昇順:Criteria.addAscendingOrderByColumn()メソッド
降順:Criteria.addDescendingOrderByColumn()メソッド
crit.addAscendingOrderByColumn(EmpPeer.EMPID); crit.addDescendingOrderByColumn(EmpPeer.EMPID);
最大件数の設定
criteria.setLimit(1000);
distinct
Criteria criteria = new Criteria();
criteria.addSelectColumn(EmpTblPeer.SALARY);
criteria.addSelectColumn(EmpTblPeer.BONUS);
criteria.setDistinct();
List list = BasePeer.doSelect(criteria);
for(int i = 0; i < list.size(); i++){
Record row = (Record)list.get(i);
System.out.print(row.getValue(1) + row.getValue(2));
}
全データ
salary bonus -------------- 100000 100000 100000 100000 100000 200000 300000 600000
実行結果
100000 100000 100000 200000 300000 600000
直接SQLを記述して実行する
List uniqueList = EmpPeer.executeQuery("select * from emp");
List joinList = BasePeer.executeQuery("select emp.*, dept.* from emp, dept where emp.id = dept.id");
int result = BasePeer.executeStatement("delete from emp");
単一検索を行う場合、自動生成されたそれぞれのPeerクラスを利用する。結合して検索を行う場合、各PeerクラスのスーパークラスであるBasePeerクラスを利用することもできる。
また、問い合わせにはexecuteQuery()メソッドを利用し、追加・更新・削除にはexecuteStatement()メソッドを利用する。
Antタスク
トランザクション
Torqueでは自動生成時にオーバーロードメソッドが生成される。トランザクションのつながりを意識するときは、Connectionオブジェクトを引数に持つメソッドを利用する。
トランザクションが更新ごとに孤立している例。
EmpPeer.doUpdate(new Emp()); DeptPeer.doInsert(new Dept());
各メソッドが実行される度に、コミットが実行される。
複数の更新がトランザクション管理されている例。
Connection con = Torque.getConnection();
try{
EmpPeer.doUpdate(new Emp(), con);
DeptPeer.doInsert(new Dept(), con);
con.commit();
}catch(TorqueException e){
con.rollback();
}finally{
con.close();
}
con.commit()が実行された時点ですべての更新が実行される。
リンク
Java/Torque/ソースファイル自動生成クイックスタート
概要
Torqueをダウンロードしてから、データベースを操作するためのクラスを作るまでのクイックスタート。
クイックスタートガイド(本家)
Torqueを動作させるためにしなければならないことは、 build.propertiesの中に対象となるデータベース、 および対象となるパッケージを記述し、 project-schema.xmlをあなたのニーズに合わせ編集し、 そしてant -f build-torque.xmlをタイプする、それだけです!
(http://www.jajakarta.org/turbine/jp/turbine/torque/user-guide.html)
ここでの前提
データベースシステムはMySQL5.1
データベースはtorquedb
テーブルはuser(userid, password)が存在している。
Torqueのダウンロード
以下のサイトより、”Generator”のバイナリファイルをダウンロードする。
(現時点での最新安定バージョンはは3.3)
-Torque
–http://db.apache.org/torque/
Torqueの設定(インストール)
Torque用のディレクトリを作成する。
├─lib
├─schema
└─src
ダウンロードしたファイルを解凍して、必要なファイルをフォルダに配置する。
│ build-torque.xml
│ build.properties
│
├─lib
│ ant-1.7.0.jar
│ commons-collections-3.2.jar
│ commons-lang-2.3.jar
│ commons-logging-1.1.jar
│ log4j-1.2.14.jar
│ texen-1.0.jar
│ torque-gen-3.3.jar
│ torque-gen-templates-3.3.jar
│ velocity-1.5.jar
│ village-3.3.jar
│ xercesImpl-2.6.2.jar
│ xml-apis-2.0.2.jar
│
├─schema
│ id-table-schema.xml
│
└─src
libフォルダにはクラスパスを通す。
eclipseの場合はプロジェクト名右クリック→プロパティ→Javaのビルドパス→ライブラリー→JARの追加
定義ファイル
プロジェクト名(プロジェクトID)を考える
まず、プロジェクトのIDを決めます。
例
sampleapp, myapplication
ここではsampleappとする。
schema/id-table-schema.xml
ファイル名を「プロジェクト名-schema.xml」に変更します。
例
続いて内容を、実際のデータベースに合わせて記述します。
sampleapp-schema.xml
<!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database_3_0_1.dtd">
<table name="user">
<column name="user" required="true" primaryKey="true" type="INTEGER"/>
</table>
</database>
build.properties
最低限必要な箇所として、以下の部分を変更します。
-torque-project
–プロジェクト名を指定
–例:torque.project = sampleapp
-torque.database
–利用するデータベースを指定
–例:torque.database = mysql
–現時点で、以下の値が指定可能
—axion, cloudscape, db2, db2400
—hypersonic, interbase, msaccess
—mssql, mysql, oracle, postgresql
—sapdb, sybase
-torque.targetPackage
-生成したファイルを格納するパッケージを指定
–例:torque.targetPackage = sample.dao
-データベースの設定
–torque.database.createUrl
–データベース作成時の接続先URL
–例:torque.database.createUrl = jdbc:mysql://localhost/torquedb
–torque.database.buildUrl
–テーブル作成時の接続先URL
–例:torque.database.buildUrl = jdbc:mysql://localhost/torquedb
–torque.database.url
–接続時のURL
–例:torque.database.url = jdbc:mysql://localhost/torquedb
–torque.database.driver
–接続に利用するドライバクラス
–例:torque.database.driver = com.mysql.jdbc.Driver
–torque.database.user
–データベースユーザーの指定
–例:torque.database.user = root
–torque.database.password
–データベース接続パスワードの指定
–例:torque.database.password =
–torque.database.host
–データベースのホスト名(IP)を指定
–例:torque.database.host = 127.0.0.1
build-torque.xml
変更点なし
ソースファイルの自動生成
antをコマンドラインで実行
eclipseからビルド実行
「build-torque.xml上で右クリック→実行→Antビルド」を選択
作成中のコンソールの様子
main:
check-use-classpath:
check-run-only-on-schema-change:
sql-check:
sql:
[echo] +——————————————+
[echo] | |
[echo] | Generating SQL for YOUR Torque project! |
[echo] | |
[echo] +——————————————+
sql-classpath:
[echo] loading templates from classpath
[torque-sql] Using contextProperties file: C:\Torque\build.properties
[torque-sql] Using classpath
[torque-sql] Generating to file C:\Torque\src\sql\report.sampleapp.sql.generation
sql-template:
check-use-classpath:
check-run-only-on-schema-change:
om-check:
om:
[echo] +——————————————+
[echo] | |
[echo] | Generating Peer-based Object Model for |
[echo] | YOUR Torque project! |
[echo] | |
[echo] +——————————————+
om-classpath:
[torque-data-model] Using contextProperties file: C:\Torque\build.properties
[torque-data-model] Using classpath
[torque-data-model] Generating to file C:\Torque\src\java\report.sampleapp.om.generation
[torque-data-model] Using contextProperties file: C:\Torque\build.properties
[torque-data-model] Using classpath
[torque-data-model] Generating to file C:\Torque\src\java\report.sampleapp.om.base.generation
om-template:
BUILD SUCCESSFUL
Total time: 7 seconds
ファイル完成
└─dao
│ BaseUser.java
│ BaseUserPeer.java
│ User.java
│ UserPeer.java
│
└─map
TorquedbMapInit.java
UserMapBuilder.java

