S2Dao SQLファイル
スポンサード リンク1.SQLファイル2
前回のSELECT文では、SQLファイルを用意しSQLを発行していました。
しかし、条件の値(ID BETWEEN 1 AND 2の1や2)が埋め込みとなっていました。
今回は動的に条件の値を変更するやり方を記載してみたいと思います。
S2DaoではSQLファイルの値を動的に変更する方法が複数あると思うのですが、今回は自分が使い慣れている2つの方法を記載します。
まずはバィンディング変巣を使用する場合です。
2.バインディング変数を用いる場合
?を用いて値をセットする形になります。実際のSQLファイルは以下の用になります。
発行するSQLファイル(ProjectDao_selectUseSqlFileProject2.sql)
SELECT ID ,PJNAME FROM PROJECT WHERE ID BETWEEN ? AND ? ORDER BY ID
前回は「ID BETWEEN ? AND ?」の部分が「ID BETWEEN 1 AND 3」
として固定値を設定していましたが、今回は?としてバインディング変数を設定しています。
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; // SQLファイル 使用メソッド @SqlFile // SQLファイルがない場合にエラーを出力するアノテーション public List<Project> selectUseSqlFileProject2(int startId, int endId); }
対象のメソッドでは、?にセットされてほしい順番に引数をセットします。
サンプルの場合、startId、endIdの順番に値がセットされます。
では次に、対象のメソッドを呼び出すメインクラスを記載します。
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(); int startId = 1; int endId = 3; List<Project> list = pjDao.selectUseSqlFileProject2(startId, endId); for (Project project : list) { System.out.print(" project.id : " + project.id); System.out.println(" project.name : " + project.name); } } }
Mainクラスでは、前回していたメソッドの部分をコメントアウトし、今回のメソッドを有効にしています。
ID BETWEEN ? AND ?の1つ目の?に1を、2つ目の?に3が設定されるように、メソッドの1つ目の引数に1を2つ目の引数に3を設定しています。
対象となるDBのテーブルとなる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=1216727407476/0, BranchId=] DEBUG 物理的なコネクションを取得しました DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1216727407476/0, BranchId=] DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1216727407476/0, BranchId=] DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1216727407476/0, BranchId=] DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1216727407476/0, BranchId=] DEBUG 論理的なコネクションを取得しました。tx=[FormatId=4360, GlobalId=1216727407476/0, BranchId=] DEBUG SELECT ID ,PJNAME FROM PROJECT WHERE ID BETWEEN 1 AND 3 ORDER BY ID DEBUG 論理的なコネクションを閉じました。tx=[FormatId=4360, GlobalId=1216727407476/0, BranchId=] DEBUG トランザクションをコミットしました。tx=[FormatId=4360, GlobalId=1216727407476/0, BranchId=] project.id : 1 project.name : S2Dao project.id : 2 project.name : S2プロジェクト 入門 project.id : 3 project.name : S2Dao_SELECT句の説明
発行されているSQLにて
DEBUG SELECT ID ,PJNAME FROM PROJECT WHERE ID BETWEEN 1 AND 3 ORDER BY ID
となっており、?の値がメインクラスにて設定した引数で変更されています。
取得されている値も、SQLの条件どおりIDが1~3間での値を取得してます。
このようにSQLファイルに?を記載することによって、動的に値を変更することができます。
次回は、また違ったやり方で動的に値を変更するやり方を記載してみたいと思います。
Seasar2 Topに戻る