スポンサード リンク

S2Dao SQLコメント IFコメント

スポンサード リンク

1.SQLコメント(IFコメント)

前回はSQLファイルの中身を埋め込み変数コメントを用いて動的に値を変更してました。
今回は同様にIFコメントを使用してSQLを動的に変更するSQLを発行してみたいと思います。

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

SELECT
    ID
    ,PJNAME
FROM
    PROJECT
WHERE
/*IF pjName != null*/
    PJNAME = /*pjName*/'S2Dao'
--ELSE PJNAME IS NULL
/*END*/
    

IFコメントでは、/*IF*/と/*END*/に囲まれた部分が評価されます。
今回のサンプルでは、PJNAMEがnull以外の場合には「PJNAME = /*pjName*/'S2Dao'」の条件が評価されます。
nullの場合には、--ELSEの後の「PJNAME IS NULL」の条件が評価されます。

次に対象のSQLファイルを呼び出すメソッドを記載します。

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 {

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

次に対象のメソッドを呼び出すためのメインクラスを記載してみます。
引数に文字列を記載した場合と、nullを設定している場合の2回呼び出しています。

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.selectUseSqlFileProject5("S2Dao");
        for (Project project : list) {
            System.out.print(" project.id : " + project.id);
            System.out.println(" project.name : " + project.name);
        }

        List<Project> list2 = pjDao.selectUseSqlFileProject5(null);
        System.out.println("nullの場合の結果 : listSize = "  + list2.size());

    }
}
    

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

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=1217429262937/0, BranchId=]
DEBUG 物理的なコネクションを取得しました
DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1217429262937/0, BranchId=]
DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1217429262937/0, BranchId=]
DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1217429262937/0, BranchId=]
DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1217429262937/0, BranchId=]
DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1217429262937/0, BranchId=]
DEBUG SELECT
    ID
    ,PJNAME
FROM
    PROJECT
WHERE

    PJNAME = 'S2Dao'

DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1217429262937/0, BranchId=]
DEBUG トランザクションをコミットしました。tx=[FormatId=4360, GlobalId=1217429262937/0, BranchId=]
 project.id : 1 project.name : S2Dao
DEBUG トランザクションを開始しました。tx=[FormatId=4360, GlobalId=1217429262937/1, BranchId=]
DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1217429262937/1, BranchId=]
DEBUG SELECT
    ID
    ,PJNAME
FROM
    PROJECT
WHERE
PJNAME IS NULL

DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1217429262937/1, BranchId=]
DEBUG トランザクションをコミットしました。tx=[FormatId=4360, GlobalId=1217429262937/1, BranchId=]
nullの場合の結果 : listSize = 0
    

実行結果で2回SQLが発行されています。
まず1回目のSQLでは、pjNameに文字列が設定されているのでIFコメントの部分が真になり「PJNAME = /*pjName*/'S2Dao'」が評価され 「PJNAME = 'S2Dao'」と条件が設定されています。
2回目のSQLでは、pjNameにnullが設定されているのでIFコメントの部分が偽になり「PJNAME IS NULL」が設定されています。
このようにSQLを発行する際に条件によってSQLを動的に変更することができます。



Seasar2 Topに戻る
inserted by FC2 system