S2Dao SQLコメント BEGINコメント
スポンサード リンク1.SQLコメント(BEGINコメント)
前回はSQLファイルの中身を埋め込みIFコメントを用いて動的に値を変更してました。
BEGINコメントでは、IFコメントにてすべての値がfalseになった場合に、「WHERE句」自体を出力しないようにします。
BEGINコメントは、IFコメントと組み合わせて使用します。
では早速、記載してみたいと思います。
発行するSQLファイル(ProjectDao_selectUseSqlFileProject6.sql)
/* IFコメントのサンプル */ SELECT ID ,PJNAME FROM PROJECT /*BEGIN*/ WHERE /*IF pjName != null*/PJNAME = /*pjName*/'S2Dao'/*END*/ /*END*/
通常のSQLツールで発行した場合には、「PJNAME = /*pjName*/'S2Dao'」の部分が評価され、
WHERE PJNAME = 'S2Dao' というWHERE句が評価されます。
次に対象の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> selectUseSqlFileProject6(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.selectUseSqlFileProject6("S2Dao"); for (Project project : list) { System.out.print(" project.id : " + project.id); System.out.println(" project.name : " + project.name); } List<Project> list2 = pjDao.selectUseSqlFileProject6(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=1217861834867/0, BranchId=] DEBUG 物理的なコネクションを取得しました DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1217861834867/0, BranchId=] DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1217861834867/0, BranchId=] DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1217861834867/0, BranchId=] DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1217861834867/0, BranchId=] DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1217861834867/0, BranchId=] DEBUG /* IF繧ウ繝。繝ウ繝医?ョ繧オ繝ウ繝励Ν */ SELECT ID ,PJNAME FROM PROJECT WHERE PJNAME = 'S2Dao' DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1217861834867/0, BranchId=] DEBUG トランザクションをコミットしました。tx=[FormatId=4360, GlobalId=1217861834867/0, BranchId=] project.id : 1 project.name : S2Dao DEBUG トランザクションを開始しました。tx=[FormatId=4360, GlobalId=1217861834867/1, BranchId=] DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1217861834867/1, BranchId=] DEBUG /* IF繧ウ繝。繝ウ繝医?ョ繧オ繝ウ繝励Ν */ SELECT ID ,PJNAME FROM PROJECT DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1217861834867/1, BranchId=] DEBUG トランザクションをコミットしました。tx=[FormatId=4360, GlobalId=1217861834867/1, BranchId=] nullの場合の結果 : listSize = 4
まず1度目のメソッドの呼び出しの際には、引数に「S2Dao」と渡しているため、IFコメントの条件がtrueとなりBEGINコメントの内容も評価され
WHERE句が出力された状態でSQLが生成されます。
次に、2度目のメソッドの呼び出しの際には、引数に「null」を渡しているため、IFコメントの条件がfalseとなりBEGINコメントの中身が
すべてfalseとなりWHERE句が評価されない状態でSQLが生成されます。
このようにIFコメントの内容によってWHERE句自体の出力をコントロールすることができます。
Seasar2 Topに戻る