S2Dao SQLコメント
スポンサード リンク1.SQLコメント
前回のSELECT文では、SQLファイルを用意しSQLを発行していました。
またその中でバインディング変数を用いて、値を動的に変更していました。
今回はSQLコメントを使用して条件等を動的に変更するやり方を記載します。
2.SQLコメントを用いる場合
メソッドの引数とSQL文のバインド変数の対応を/**/や--などのコメントを使用して動的に変更します。
バインド変数の部分はSQL的にはコメントのため通常のSQLツールを使用して確認することができるので
SQLツールでSQLを確認しながらSQL文を構築していくことができます。
Tableの条件等は、前回までの条件と同じになります。
tableの中身は以下のようになります。
作成する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 */といった具合に、/* の直後に半角スペースをセットします。
では実際に発行して見ます。
では次に、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に戻る