Apache DB Project – torque

1月 1, 2003 · Posted in Torque · Comment 

torqueとは

TorqueはO/Rマッピングフレームワークである。

O/Rデータベースマッピングフレームワーク

オブジェクト指向とリレーショナルデータベースを用いてシステムを開発すると、インピーダンス・ミスマッチ(Impedance Mismatch)と呼ばれるギャップが発生する。これはオブジェクト指向とリレーショナルデータベースとの考え方が異なるためである。
O/Rマッピングフレームワークとは、このギャップを軽減するためのフレームワークのことで、O/RのOはオブジェクト、Rはリレーショナルを意味している。

torqueの特徴

Torqueは次のような特徴を持っている。

  • 各種定義ファイルの相互自動生成。
  • 基本的なデータベースアクセスクラスの自動生成。
  • 自動生成したクラスの拡張化サポート。
  • 多くのデータベースプロダクトに対応。

多くのデータベースプロダクトに対応。

いろいろな種類のデータベースに対応している。

直接対応していないデータベースに対しても、アダプタクラスを作成することで対応することが可能。

各種定義ファイルの相互自動生成。

Torqueでは、XMLファイルやSQL文などを利用した各種処理の自動化を実現している。
強く密接している定義ファイルは、片方のファイルからもう一方のファイルを自動生成できるような開発者の負荷を軽減するような機能がサポートされている。

基本的なデータベースアクセスクラスの自動生成。、自動生成したクラスの拡張化サポート。

Torqueはひとつのテーブルに対して4つのクラスを自動生成する。
それら4つのクラスを分類すると、テーブルの行を表すObject Modelクラスと、SQLがラップされているAssociated SQLクラスとなる。
Object ModelクラスとAssociated SQLクラスは共に、基底クラスとそれを継承するクラスのペアになっている。
基底クラスはテーブルに対する基本的な操作が実装されており、開発者が直接編集することは推奨されていない。
基底クラスの操作を拡張した処理を実現したいときは、継承クラスに処理を記述することになる。

単一テーブルに対する操作

基本は以下の4つ(検索・挿入・更新・削除)

検索

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を利用した様々な検索

org.apache.torque.util.Criteriaクラスを利用して、さまざまな条件を設定すると、Torqueが自動的にSQL組み立てを行ってくれるため、SQLを書かずにいろいろな条件の検索(または追加・更新・削除)を実行することができる。

処理の基本的な流れ。

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を記述して実行する

複雑なSQLやサポートされていない機能を実現するために、直接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でのトランザクション管理は、org.apache.torque.util.Transactionクラスを利用して行う。自動生成のクラス、メソッドを利用する場合は、直接Transactionクラスは利用する必要がない。
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/ソースファイル自動生成クイックスタート

1月 1, 2003 · Posted in Java, Torque · Comment 

概要

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

続いて内容を、実際のデータベースに合わせて記述します。
sampleapp-schema.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database_3_0_1.dtd">
<database name="torquedb">
<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をコマンドラインで実行

ant -f build-torque.xml

eclipseからビルド実行

「build-torque.xml上で右クリック→実行→Antビルド」を選択

作成中のコンソールの様子

Buildfile: C:\Torque\build-torque.xml
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

ファイル完成

sample
└─dao
│ BaseUser.java
│ BaseUserPeer.java
│ User.java
│ UserPeer.java

└─map
TorquedbMapInit.java
UserMapBuilder.java

Java/Torque/問い合わせ(Criteria)

1月 1, 2003 · Posted in Java, Torque · Comment 

詳細は

http://634.ayumu-baby.com/torque/