スポンサード リンク

S2Dao SQLコメント

スポンサード リンク

1.SQLコメント

前回のSELECT文では、SQLファイルを用意しSQLを発行していました。
またその中でバインディング変数を用いて、値を動的に変更していました。
今回はSQLコメントを使用して条件等を動的に変更するやり方を記載します。

2.SQLコメントを用いる場合

メソッドの引数とSQL文のバインド変数の対応を/**/や--などのコメントを使用して動的に変更します。
バインド変数の部分はSQL的にはコメントのため通常のSQLツールを使用して確認することができるので SQLツールでSQLを確認しながらSQL文を構築していくことができます。
Tableの条件等は、前回までの条件と同じになります。
tableの中身は以下のようになります。

PROJECTテーブルの中身

作成するSQLファイルの内容は以下のようになります。

発行するSQLファイル(ProjectDao_selectUseSqlFileProject3.sql)

SELECT
    ID
    ,PJNAME
FROM
    PROJECT
WHERE
    ID BETWEEN /*startId*/'1' AND /*endId*/'3'
AND
    PJNAME = /*pjName*/'S2Dao_SELECT句の説明'
ORDER BY
    ID
    

ここで注目したいのは、Where句の後に

ID BETWEEN /*startId*/'1' AND /*endId*/'3'
AND
PJNAME = /*pjName*/'S2Dao_SELECT句の説明'
    

といった条件が記載されていることです。
コメント文(/*startId*/等)が記載され、その後に値(1、3等)が記載されています。
実際にSQLツールにて発行する際には、コメント文は無視され値のみが使用されます。
通常のSQLコメントとして使用したい場合には、/* startId */といった具合に、/* の直後に半角スペースをセットします。
では実際に発行して見ます。

SQLの実行結果

では次に、Javaのメソッドから呼び出すようにしてみたいと思います。
まずはDaoクラスのProjectDao.javaを確認してみます。

ProjectDao.java

package snowhiro;

import java.util.List;

import org.seasar.dao.annotation.tiger.Arguments;
import org.seasar.dao.annotation.tiger.Query;
import org.seasar.dao.annotation.tiger.S2Dao;
import org.seasar.dao.annotation.tiger.SqlFile;

/**
 * Dao用のサンプルファイル。
 *
 * */
// Beanとのマッピングを記載します。
@S2Dao(bean = Project.class)
public interface ProjectDao {

    // tigerアノテーションを使用しない場合には以下のように記載します。
    // public static final Class BEAN = Project.class;

    // 全件検索用メソッド
    public List<Project> selectProject();

    // 条件追加 SQL メソッド
    @Query("ID BETWEEN ? AND ? ORDER BY ID")
    public List<Project> selectWhereProject(String startId, String endId);

    // Queryアノテーションをtigerアノテーションを使用しない場合には以下のように記載します。
    //public static final String selectWhereProject_QUERY = "ID BETWEEN ? AND ? ORDER BY ID";

    // SQLファイル 使用メソッド
    @SqlFile    // SQLファイルがない場合にエラーを出力するアノテーション
    public List<Project> selectUseSqlFileProject();

    // SQLファイルがない場合にエラーを出力するアノテーション(Queryアノテーションをtigerアノテーションを使用しない場合)
    // public String selectUseSqlFileProject_SQL_FILE = null;

    // SQLファイル 使用メソッド
    @SqlFile    // SQLファイルがない場合にエラーを出力するアノテーション
    public List<Project> selectUseSqlFileProject2(int startId, int endId);

    // SQLファイル 使用メソッド
    @SqlFile    // SQLファイルがない場合にエラーを出力するアノテーション
    @Arguments({"startId","endId","pjName"})    // メソッドの引数名を指定するアノテーション
    public List<Project> selectUseSqlFileProject3(int startId, int endId, String pjName);

    // ARGSアノテーション tigerアノテーションを使用しない場合
    // public static final String selectUseSqlFileProject3_ARGS = "startId,endId,pjName";

}
    

今回追加した部分は以下の部分になります。

// SQLファイル 使用メソッド
@SqlFile    // SQLファイルがない場合にエラーを出力するアノテーション
@Arguments({"startId","endId","pjName"})    // メソッドの引数名を指定するアノテーション
public List<Project> selectUseSqlFileProject3(int startId, int endId, String pjName);
    

メソッドの引数として以下の3つが設定されています。

  • int startId
  • int endId
  • String pjName

また引数用アノテーションの@Argumentsにて、{"startId","endId","pjName"}の3つを設定しています。
このとき、引数の順番とアノテーションに宣言されている順番が同一である必要があります。
またSQLファイルに記載されているSQLコメントの部分(/*startId*/、/*endId*/、/*pjName*/)の名称とメソッドのアノテーションの名称が一致している 部分に対象の値がセットされます。
では次に、対象のメソッドを呼び出すメインクラスを記載します。

S2Dao_sample10.java

package snowhiro;

import java.util.List;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

/**
 * S2Daoのサンプルメインクラス
 */
public class S2Dao_sample10 {

    // 設定ファイルのPath
    private static final String PATH = "snowhiro/s2Dao.dicon";

    /**
     * メインクラス
     * @param args 引数
     */
    public static void main(String[] args) {
        System.out.println("S2Dao_sample10 開始");

        // 設定ファイルを読み込む.
        SingletonS2ContainerFactory.setConfigPath(PATH);

        // 初期化する.
        SingletonS2ContainerFactory.init();

        // コンテナを取得する.
        S2Container container = SingletonS2ContainerFactory.getContainer();

        ProjectDao pjDao = (ProjectDao) container.getComponent(ProjectDao.class);

        // List<Project> list = pjDao.selectProject();
        // List<Project> list = pjDao.selectWhereProject("2", "3");
        // List<Project> list = pjDao.selectUseSqlFileProject();
        // List<Project> list = pjDao.selectUseSqlFileProject2(startId, endId);
        int startId = 2;
        int endId = 4;
        String pjName = "S2DaoでselectのWhere句を追加する";

        List<Project> list = pjDao.selectUseSqlFileProject3(startId, endId, pjName);
        for (Project project : list) {
            System.out.print(" project.id : " + project.id);
            System.out.println(" project.name : " + project.name);
        }

    }
}
    

では実際に実行してみたいと思います。

S2Dao_sample10 開始
DEBUG S2Containerを作成します。path=snowhiro/s2Dao.dicon
DEBUG S2Containerを作成します。path=dao.dicon
DEBUG S2Containerを作成します。path=j2ee.dicon
DEBUG S2Containerを作成します。path=jta.dicon
DEBUG S2Containerを作成しました。path=jta.dicon
DEBUG S2Containerを作成します。path=jdbc.dicon
DEBUG S2Containerを作成しました。path=jdbc.dicon
DEBUG S2Containerを作成しました。path=j2ee.dicon
DEBUG S2Containerを作成しました。path=dao.dicon
DEBUG S2Containerを作成しました。path=snowhiro/s2Dao.dicon
INFO  Running on [ENV]product, [DEPLOY MODE]Normal Mode
DEBUG トランザクションを開始しました。tx=[FormatId=4360, GlobalId=1216898289580/0, BranchId=]
DEBUG 物理的なコネクションを取得しました
DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1216898289580/0, BranchId=]
DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1216898289580/0, BranchId=]
DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1216898289580/0, BranchId=]
DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1216898289580/0, BranchId=]
DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1216898289580/0, BranchId=]
DEBUG SELECT
        ID
        ,PJNAME
    FROM
        PROJECT
    WHERE
        ID BETWEEN 2 AND 4
    AND
        PJNAME = 'S2DaoでselectのWhere句を追加する'
    ORDER BY
        ID
DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1216898289580/0, BranchId=]
DEBUG トランザクションをコミットしました。tx=[FormatId=4360, GlobalId=1216898289580/0, BranchId=]
 project.id : 4 project.name : S2DaoでselectのWhere句を追加する
    

実際に発行されているSQLの部分では、以下のようになっており設定Daoのメソッドに設定された引数の値が設定されています。

SELECT
    ID
    ,PJNAME
FROM
    PROJECT
WHERE
    ID BETWEEN 2 AND 4
AND
    PJNAME = 'S2DaoでselectのWhere句を追加する'
ORDER BY
    ID
    

このようにSQLファイルとSQLコメント、引数用アノテーションの@Argumentsを使用することで、 SQLの作成、JAVAファイルに転記という作業を省力化することができます。



Seasar2 Topに戻る
inserted by FC2 system