Torqueのプログラム開発手順
Torque機能
- SQL文の自動生成(簡単なSQL文限定)
- コネクションプール機能
- シーケンス機能
- テーブルに対応したラッパクラスでテーブル操作を行う
Torque制限
- project-schema.xmlに定義したテーブル名を使用してjavaファイルが生成されるので、
日本語でテーブル名を定義をすると日本語ファイル名が生成されます。
- Torqueにない機能を使用する際には、直接SQL文を書く必要があります。
- 複数のテーブルから項目を取得する場合、複数テーブル取得用の処理を追加する必要があります。
- torqueディレクトリ内にデータベース、テーブル定義ファイル、テーブル用のJAVAファイルが生成されるので
アプリケーションごとにtorqueをインストールをする必要があります。
Torqueの開発手順
※文中で使用する%TORQUE_HOME%はtorqueがインストールされているディレクトリを指します。 ※動作確認環境 Win2000 torque-3.0-b4 ant-1.5.1 j2sdk1.4.0 mysql-3.23.53
- Torque用ビルドプロパティファイル(%TORQUE_HOME%/build.properties)のデータベースの接続環境を変更します。
※データベース、テーブル作成、データベースアクセス用のラッパクラスのファイル作成時に使用します。 torque.project = Tantousya torque.database = mysql torque.targetPackage = tantousya torque.useClasspath = true torque.database.createUrl = jdbc:mysql://127.0.0.1/mysql torque.database.buildUrl = jdbc:mysql://127.0.0.1/tantousya torque.database.url = jdbc:mysql://127.0.0.1/tantousya torque.database.driver = org.gjt.mm.mysql.Driver torque.database.user = root→MySQLで設定されているユーザ名 torque.database.password = root→MySQLで設定されているパスワード torque.database.host = 127.0.0.1
- Torque用データベーススキーマ(データベース、テーブル定義ファイル)を
%TORQUE_HOME%/schema/project-schema.xml に以下のコードをコピーして作成をします。 今回はシーケンス機能を使用しないので%TORQUE_HOME%/schema/id-table-schema.xmlを削除しておきます。
1: <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
2: <!DOCTYPE database SYSTEM
3: "http://jakarta.apache.org/turbine/dtd/database.dtd">
4: <database
5: name="tantousya">
6: <table name="tantousya_mst">
7: <column
8: name="tantousyacode"
9: required="true"
10: primaryKey="true"
11: type="VARCHAR"
12: size="10" />
13: <column
14: name="tantousyaname"
15: required="true"
16: type="VARCHAR"
17: size="30" />
18: </table>
19: </database>
- 説明
- 5行目のname="tantousya"のtantousyaがデータベース名になります。
- 6行目のname="tantousya_mst"のtantousya_mstがテーブル名になります。
- 8行目のname="tantousyacode"のtantousyacodeがカラム名になります。
- 9行目のrequired=がtrueの場合は、NULLを許さなく、falseの場合は、NULLを許す設定になります。
- 10行目のprimarykey=がtrueの場合は、そのカラムをプライマリキーに設定をします。
- 11行目のtype="VARCHAR"のVARCHARがデータ型になります。
- 12行目のsize="10"の10がサイズになります。
- Torque用ランタイムプロパティ(%TORQUE_HOME%/Torque.properties)を修正します。
※アプリケーション側でデータベースに接続する時に使用します。 torque.database.default=tantousya torque.database.default.adapter=mysql torque.tantousya.default.factory=\ org.apache.torque.dsfactory.Jdbc2PoolDataSourceFactory torque.dsfactory.tantousya.pool.defaultMaxActive=10 torque.dsfactory.tantousya.pool.testOnBorrow=true torque.dsfactory.tantousya.pool.validationQuery=SELECT 1 torque.dsfactory.tantousya.connection.driver = org.gjt.mm.mysql.Driver torque.dsfactory.tantousya.connection.url = jdbc:mysql://localhost/tantousya?useUnicode=true&characterEncoding=SJIS torque.dsfactory.tantousya.connection.user = root torque.dsfactory.tantousya.connection.password = root
- 説明
- tantousya?useUnicode=true&characterEncoding=SJISは文字コードの指定をしています。
この設定はMySQL用なので、MySQL以外を使用する場合には変更をする必要があります。
- defaultMaxActive=10の10は、最大コネクション数です。
- MySQL用のJDBCドライバ(mm.mysql-2.0.4-bin.jar)を
http://www.ipa.go.jp/security/ccj/CCtool_V03/mm.mysql-2.0.4-bin.jarより ダウンロードをして、%TORQUE_HOME%/libに入れます。
- Antを実行してTorque用のソースファイルを生成します。
- コマンドプロンプトで
%TORQUE_HOME%> ant -f build-torque.xmlを実行します。
- Antを実行してデータベース、テーブルを作成します。
- コマンドプロンプトで
%TORQUE_HOME%> ant -f build-torque.xml create-db %TORQUE_HOME%> ant -f build-torque.xml id-table-init-sql %TORQUE_HOME%> ant -f build-torque.xml insert-sql の3行を実行します。
- サンプルアプリケーションを作成します。
- %TORQUE_HOME%/src/java/tantousyaに以下のソースのファイルをTantousyaSample.javaで保存します。
package tantousya;
import java.util.*;
import org.apache.torque.Torque;
import org.apache.torque.util.Criteria;
public class TantousyaSample
{
public static void main(String[] args)throws Exception
{
Torque.init("Torque.properties");
//列の追加
TantousyaMst tantousya = new TantousyaMst();
tantousya.setTantousyacode("001");
tantousya.setTantousyaname("田中");
tantousya.save();
TantousyaMst tantousya2 = new TantousyaMst();
tantousya2.setTantousyacode("002");
tantousya2.setTantousyaname("野田");
tantousya2.save();
TantousyaMst tantousya3 = new TantousyaMst();
tantousya3.setTantousyacode("003");
tantousya3.setTantousyaname("木下");
tantousya3.save();
//列の削除
Criteria crit = new Criteria();
crit.add(TantousyaMstPeer.TANTOUSYACODE,"002");
TantousyaMstPeer.doDelete(crit);
//列の選択
crit = new Criteria();
List v = TantousyaMstPeer.doSelect(crit);
Iterator i = v.iterator();
while(i.hasNext()){
TantousyaMst SelectTantousya = (TantousyaMst) i.next();
System.out.println("担当者コード=" + SelectTantousya.getTantousyacode());
System.out.println("担当者名=" + SelectTantousya.getTantousyaname());
}
//列の更新
TantousyaMst tantousya4 = new TantousyaMst();
tantousya4.setTantousyacode("003");
tantousya4.setTantousyaname("木村");
TantousyaMstPeer.doUpdate(tantousya4);
}
}
- サンプルアプリケーションのコンパイル、実行をします。
- コンパイル&実行に必要なcommons-jdbc2pool-1.0-dev.jar、
commons-logging-1.0.jarを http://jakarta.apache.org/turbine/jars/からダウンロードして、 %TORQUE_HOME%/libに入れます。
- 実行用のターゲットを%TORQUE_HOME%/build-torque.xmlの最後に以下の用に追記します。
<target name="exec">
<java classname="tantousya.TantousyaSample" >
<classpath refid="torque-classpath"/>
<classpath path="./bin/classes"/>
</java>
</target>
- コンパイルを行います。
- コマンドプロンプトで
%TORQUE_HOME%> ant -f build-torque.xml compileを実行します。
- サンプルアプリケーションの実行を行います。
- コマンドプロンプトで
%TORQUE_HOME%> ant -f build-torque.xml execを実行します。 実行後、画面に、
[java] 担当者コード=001
[java] 担当者名=田中
[java] 担当者コード=003
[java] 担当者名=木下
が表示されたらサンプルは正常に動作をしています。
Torque注意事項
- シーケンス機能を使用しない場合は、%TORQUE_HOME%/schema/id-table-schema.xmlを削除しておきます。
- Antを実行してオブジェクトモデルを生成する為に%TORQUE_HOME%/build.propertiesファイルの
torque.useClasspath=falseをtrueに変更します。
- 処理を追加する場合には、BaseXXX.java、BaseXXXPeer.javaに書き込むのではなく、
XXX.java、XXXPeer.javaに書き込みます。 ※(ファイル名の頭にBaseが付くファイルは修正しない)
- 作成したアプリケーションでDBに繋ぐ際に1度だけ、Torque.propertiesを読み込んで明示的に初期化を行う必要があります。
Torque.init("Torque.properties");.
のように初期化を行います
- Criteriaに用意されている取得レコードを昇順に並べるaddAscendingOrderByColumnメソッド、降順に並べる
addDescendingOrderByColumnメソッドは、カラムの型が数値型の場合は使用できますが、文字型の場合は 使用できません。
- テーブルのプライマリキーをint型で作成を行った場合、ロジック側で設定・取得する際には、以下の用に
NumberKey型からString型に変更をする必要があります。
ユーザマスタテーブルのプライマリキーのユーザコードの設定を・取得を行う際の例です。
設定例.
UserMstPeer.setUsercode(Integer.toString(1234));
取得例.
int UserCode = Integer.parseInt(UserMst.getUsercode().toString());
- テーブルのプライマリキーをString型で作成を行った場合、ロジック側で取得する際には、以下の用に
StringKey型からString型に変更をする必要があります。
プロジェクトマスタテーブルのプライマリキーのプロジェクトコードの取得を行う際の例です。
取得例.
String ProjectCode = ProjectMst.getProjectcode().toString();
- project-schema.xmlでテーブルのカラム名に"_"を使用して作成をすると、生成されるTorque接続用のjavaファ
イルでは_の次の文字が大文字に変更されて作成されます。
BookテーブルにBook_idでカラム名を作成した場合、生成されるTorque接続用のファイルでは、BookIdに変更されます。
- project-schema.xmlでタグを使用してテーブルの作成を行おうとすると、
MySQLではテーブルが作成されない事を確認しました。
自分で書いたSQL文を実行する方法
TantousyaMstPeer.java(project-schema.xmlを基に生成されるJAVAファイル)に 自分で書いたSQL文を実行する処理を追加します。
1:package excel;
2:import java.util.*;
3:import org.apache.torque.*;
4:import com.workingdogs.village.*;
5:import org.apache.torque.util.*;
6:import org.apache.torque.*;
7:import org.apache.torque.om.*;
8:import jp.co.utl.comn.*;
9:
10:public class TantousyaMstPeer
11: extends excel.BaseTantousyaMstPeer
12:{
13: public static List getTantousyaData() throws TorqueException {
14: String sql = "select tantousyacode,tantousyaname from tantousya_mst order by tantousyacode desc";
15: return populateObjects(executeQuery(sql);
16: }
17:}
- 説明
- 13行目で新規に担当者マスタから担当者コード、担当者名を担当者コードの降順で取得する
getTantousyaDataメソッドを宣言しています。
- 14行目で実行したいSQL文を作成します。
- 15行目のexceuteQueryが自分で作成したSQL文を実行するメソッドです。
populateObjectsは、取得してきたテーブルのデータを担当者マスタ用にキャストするメソッドです。
Torqueを用いて複数テーブルから列を選択する方法
- 例)ユーザマスタに登録されているユーザの、ユーザコード、ユーザ名、グループコード、グループ名を取得して表示する。
テーブル名:user_mst(ユーザマスタ) カラム名:usercode(ユーザコード) :username(ユーザ名) :groupcode(グループコード) テーブル名:group_mst(グループマスタ) カラム名:groupcode(グループコード) :groupname(グループ名)
- UserMst.java追加処理
private String groupname;
//グループ名の設定
public void setGroupname(String groupname){
this.groupname = groupname;
}
//グループ名の取得
public String getGroupname(){
return this.groupname;
}
- userMstPeer.java追加処理
import java.util.*;
import org.apache.torque.*;
import com.workingdogs.village.*;
import org.apache.torque.util.*;
import org.apache.torque.Torque;
import org.apache.torque.TorqueException;
import org.apache.torque.om.StringKey;
import com.workingdogs.village.Record;
import com.workingdogs.village.DataSetException;
-----------------------------ここまではインポートするパッケージで、以下が追加する処理です。-------------------------------
public static List getdata() throws TorqueException {
//SQL文作成
String sql = "select user_mst.usercode,user_mst.username,user_mst.groupcode,group_mst.groupname from user_mst,group_mst where user_mst.groupcode=group_mst.groupcode order by user_mst.usercode ASC";
return populateObjects2(executeQuery(sql));
}
public static UserMst row2Object2(Record row,int offset,Class cls)
throws TorqueException
{
try{
UserMst obj = (UserMst) cls.newInstance();
populateObject2(row, offset, obj);
obj.setModified(false);
obj.setNew(false);
return obj;
} catch (InstantiationException e){
throw new TorqueException(e);
} catch (IllegalAccessException e){
throw new TorqueException(e);
}
}
public static void populateObject2(Record row,int offset,UserMst obj)
throws TorqueException
{
try{
if (row.getValue(offset + 0).asString() instanceof Object){
if (null == row.getValue(offset + 0).asString()){
obj.setUsercode((StringKey) null);
} else {
obj.setUsercode(new StringKey(row.getValue(offset + 0).asString()));
}
}
obj.setUsername(row.getValue(offset + 1).asString());
obj.setGroupcode(row.getValue(offset + 2).asString());
obj.setGroupname(row.getValue(offset + 3).asString()); //取得追加項目のグループ名
} catch (DataSetException e) {
throw new TorqueException(e);
}
}
public static List populateObjects2(List records)
throws TorqueException
{
List results = new ArrayList(records.size());
for (int i = 0; i < records.size(); i++){
Record row = (Record) records.get(i);
results.add(UserMstPeer.row2Object2(row, 1,UserMstPeer.getOMClass()));
}
return results;
}
- 説明
- UserMst.javaでは、ユーザマスタテーブルにないグループ名のセッター・ゲッターを用意します。
- UserMstPeer.javaのpopulateObject2の、
obj.setGroupname(row.getValue(offset + 3).asString()) は取得したレコード4番目のカラム情報をUserMst.javaに追加した、グループ名に設定をしています。
- UserMstPeer.javaのpopulateObject2は、
obj.setGroupname(row.getValue(offset + 3).asString()) を追加してメソッド名を変更をした以外はUserMstPeer.javaのpopulateObject2と同じ処理を行っています。
- UserMstPeer.javaのrow2Object2、populateObjects2メソッドは、populateObject2を呼ぶ
為だけに追加したメソッドなので、BaseUserMstPeer.javaのrow2Object、populateObjects メソッドと名前が違うだけで処理内容は同じです。
コネクションプールの使用方法
データベースから取得レコード数と、取得開始位置の指定方法
例)取得開始位置5から10レコードを取得する場合 executeQuery(SQL文,5,10,データベース名,false) データベース名は、Torque.getDefaultDB()で取得できます。 falseの部分はSingleRecordの設定です。 (SingleRecordの意味は未調査です。Torqueを使用してSQL文を生成する際にはfalseに設定されます。)
ログファイルの出力場所の指定方法
- 説明
- Torque.propertiesファイルの、
torque.applicationRoot = .の"."部分変更するか log4j.appender.org.apache.torque.file = ${torque.applicationRoot}/logs/torque.logの ${torque.applicationRoot!}/logs/torque.log}部分を変更する事で、出力先が指定できます。
開発Tips
|
|