今回の開発では諸事情で同じ構成のテーブルが複数作られるので、S2Dao,S2JDBCで動的にSQLが変えられないか見てみました。
S2Dao
Beanのテーブル名を変えればどうにかなるかなと思いましたが、テーブル名が基本的にクラスに対し静的なプロパティになっているので挫折。
↓が出来ればS2Daoでもどうにかなるんだけど…。
http://lists.sourceforge.jp/mailman/archives/seasar-user/2005-February/001465.html
S2JDBC
BasicSelectHandlerを継承してSQLの一部を動的に置き換えるようにして実装。
public class FormatSQLSelectHandler extends BasicSelectHandler { private String[] params; private MessageFormat format; public String[] getParams() { return params; } public void setParams(String[] params) { this.params = params; setSql(format.format(params)); } public String getSql() { return super.getSql(); } public void setSql(String sql) { format = new MessageFormat(sql); super.setSql(sql); } }
diconファイル
<component name="selectHandler" class="FormatSQLSelectHandler" instance="prototype" > <property name="resultSetHandler"> <component class="org.seasar.extension.jdbc.impl.MapListResultSetHandler"/> </property> <property name="sql">"select * from {0}"</property> </component>
使い方(Oracleのテーブル一覧を取得)
FormatSQLSelectHandler handler = (FormatSQLSelectHandler) container.getComponent("selectHandler"); handler.setParams(new String[] {"TAB"}); List mapList = (List) handler.execute(null);