UniServer / UniPrint / UniHttpd


Torqueのプログラム開発手順


Torque機能

  1. SQL文の自動生成(簡単なSQL文限定)
  2. コネクションプール機能
  3. シーケンス機能
  4. テーブルに対応したラッパクラスでテーブル操作を行う

Torque制限

  1. project-schema.xmlに定義したテーブル名を使用してjavaファイルが生成されるので、
    日本語でテーブル名を定義をすると日本語ファイル名が生成されます。
  2. Torqueにない機能を使用する際には、直接SQL文を書く必要があります。
  3. 複数のテーブルから項目を取得する場合、複数テーブル取得用の処理を追加する必要があります。
  4. torqueディレクトリ内にデータベース、テーブル定義ファイル、テーブル用のJAVAファイルが生成されるので
    アプリケーションごとにtorqueをインストールをする必要があります。

Torqueの開発手順

※文中で使用する%TORQUE_HOME%はtorqueがインストールされているディレクトリを指します。
※動作確認環境
 Win2000
 torque-3.0-b4
 ant-1.5.1
 j2sdk1.4.0
 mysql-3.23.53

  1. 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
  2. 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がサイズになります。
  3. 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=1010は、最大コネクション数です。
  1. 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に入れます。
  2. Antを実行してTorque用のソースファイルを生成します。
    1. コマンドプロンプトで
      %TORQUE_HOME%> ant -f build-torque.xmlを実行します。
  3. Antを実行してデータベース、テーブルを作成します。
    1. コマンドプロンプトで
      %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行を実行します。
  4. サンプルアプリケーションを作成します。
    1. %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);
             }
      }
  5. サンプルアプリケーションのコンパイル、実行をします。
    1. コンパイル&実行に必要なcommons-jdbc2pool-1.0-dev.jar、
      commons-logging-1.0.jarを
      http://jakarta.apache.org/turbine/jars/からダウンロードして、
      %TORQUE_HOME%/libに入れます。
    2. 実行用のターゲットを%TORQUE_HOME%/build-torque.xmlの最後に以下の用に追記します。
      <target name="exec">
             <java classname="tantousya.TantousyaSample" >
                     <classpath refid="torque-classpath"/>
                     <classpath path="./bin/classes"/>
             </java>
      </target>
    3. コンパイルを行います。
      1. コマンドプロンプトで
        %TORQUE_HOME%> ant -f build-torque.xml compileを実行します。
    4. サンプルアプリケーションの実行を行います。
      1. コマンドプロンプトで
        %TORQUE_HOME%> ant -f build-torque.xml execを実行します。
        実行後、画面に、
            [java] 担当者コード=001
            [java] 担当者名=田中
            [java] 担当者コード=003
            [java] 担当者名=木下
        が表示されたらサンプルは正常に動作をしています。

Torque注意事項

  1. シーケンス機能を使用しない場合は、%TORQUE_HOME%/schema/id-table-schema.xmlを削除しておきます。
  2. Antを実行してオブジェクトモデルを生成する為に%TORQUE_HOME%/build.propertiesファイルの
    torque.useClasspath=falsetrueに変更します。
  3. 処理を追加する場合には、BaseXXX.javaBaseXXXPeer.javaに書き込むのではなく、
    XXX.javaXXXPeer.javaに書き込みます。
    ※(ファイル名の頭にBaseが付くファイルは修正しない)
  4. 作成したアプリケーションでDBに繋ぐ際に1度だけ、Torque.propertiesを読み込んで明示的に初期化を行う必要があります。
    Torque.init("Torque.properties");.
    のように初期化を行います
  5. Criteriaに用意されている取得レコードを昇順に並べるaddAscendingOrderByColumnメソッド、降順に並べる
    addDescendingOrderByColumnメソッドは、カラムの型が数値型の場合は使用できますが、文字型の場合は
    使用できません。
  6. テーブルのプライマリキーをint型で作成を行った場合、ロジック側で設定・取得する際には、以下の用に
    NumberKey型からString型に変更をする必要があります。
    ユーザマスタテーブルのプライマリキーのユーザコードの設定を・取得を行う際の例です。
    設定例.
       UserMstPeer.setUsercode(Integer.toString(1234));
    
    取得例.
       int UserCode = Integer.parseInt(UserMst.getUsercode().toString());
  7. テーブルのプライマリキーをString型で作成を行った場合、ロジック側で取得する際には、以下の用に
    StringKey型からString型に変更をする必要があります。
    プロジェクトマスタテーブルのプライマリキーのプロジェクトコードの取得を行う際の例です。
    取得例.
       String ProjectCode = ProjectMst.getProjectcode().toString();
  8. project-schema.xmlでテーブルのカラム名に"_"を使用して作成をすると、生成されるTorque接続用のjavaファ
    イルでは_の次の文字が大文字に変更されて作成されます。
    BookテーブルにBook_idでカラム名を作成した場合、生成されるTorque接続用のファイルでは、BookIdに変更されます。
  9. 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のrow2Object2populateObjects2メソッドは、populateObject2を呼ぶ
      為だけに追加したメソッドなので、BaseUserMstPeer.javaのrow2ObjectpopulateObjects
      メソッドと名前が違うだけで処理内容は同じです。

コネクションプールの使用方法

  • 以下のコードでは10個のコネクションを取得して、すぐに返す処理をしています。
    Connection con1 = Torque.getConnection();
    Connection con2 = Torque.getConnection();
    Connection con3 = Torque.getConnection();
    Connection con4 = Torque.getConnection();
    Connection con5 = Torque.getConnection();
    Connection con6 = Torque.getConnection();
    Connection con7 = Torque.getConnection();
    Connection con8 = Torque.getConnection();
    Connection con9 = Torque.getConnection();
    Connection con10 = Torque.getConnection();
    Torque.closeConnection(con1);
    Torque.closeConnection(con2);
    Torque.closeConnection(con3);
    Torque.closeConnection(con4);
    Torque.closeConnection(con5);
    Torque.closeConnection(con6);
    Torque.closeConnection(con7);
    Torque.closeConnection(con8);
    Torque.closeConnection(con9);
    Torque.closeConnection(con10);

データベースから取得レコード数と、取得開始位置の指定方法

例)取得開始位置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

 

Copyright © UTL Co.,Ltd. All Rights Reserved. [UTL]