スポンサード リンク

S2Dao SELECT文 SQLファイル

スポンサード リンク

1.SQLファイル

前回のSELECT文では、QUERYアノテーションを用いてselect文に条件を追加し自動生成していました。
簡単なSQLであれば問題ないのですが、条件が複雑になったときにJavaのファイル内に長々とSQLを書くのはあまり望ましくありません。
そこで今回はSQL自体を外出しにしてしまうSQLファイルについて記載したいと思います。
発行するSQLおよび対象のテーブル等の条件は前回と同じ条件とします。
では発行するSQLファイルを作成します。

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

SELECT
    ID
    ,PJNAME
FROM
    PROJECT
WHERE
    ID BETWEEN 1 AND 2
ORDER BY
    ID
    

SQLファイルの中身は通常のSQLツールで実行することができるSQLです。
ここで重要なポイントとなるのは、SQLファイルの名前になります。
S2DaoのSQLファイルの機能を使用する際のファイル名には、
「対象のDaoインターフェース名 + '_' + メソッド名 + '.sql'」
の形式になっており、
対象のDaoインターフェイスと同じパッケージに配置される必要があります
また今回の条件としては「ID BETWEEN 1 AND 2」として条件の1と2を埋め込んでいますが、
動的に変更することもできます。
次回以降記載してみたいと思います。
では次に、Daoインターフェイスに対象のメソッドを追加したいと思います。

ProjectDao.java

package snowhiro;

import java.util.List;

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;
}
    

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

    }
}
    

Mainクラスでは、前回していたメソッドの部分をコメントアウトし、今回のメソッドを有効にしています。
対象となるDBのテーブルとなるPROJECTの中身は以下のようになります。

PROJECTテーブルの中身

それでは早速実行してみたいと思います。

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=1216395760687/0, BranchId=]
DEBUG 物理的なコネクションを取得しました
DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1216395760687/0, BranchId=]
DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1216395760687/0, BranchId=]
DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1216395760687/0, BranchId=]
DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1216395760687/0, BranchId=]
DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1216395760687/0, BranchId=]
DEBUG SELECT
        ID
        ,PJNAME
    FROM
        PROJECT
    WHERE
        ID BETWEEN 1 AND 2
    ORDER BY
        ID
DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1216395760687/0, BranchId=]
DEBUG トランザクションをコミットしました。tx=[FormatId=4360, GlobalId=1216395760687/0, BranchId=]
 project.id : 1 project.name : S2Dao
 project.id : 2 project.name : S2プロジェクト 入門
    

先ほど記載したファイルから、SQLの本文が読み込まれて、実際に発行されています。
取得した結果は、設定されているBeanに対してマッピングされてセットされます。
次回は、SQLファイルの要素を動的に変更してみたいと思います。



Seasar2 Topに戻る
inserted by FC2 system