解決→古ーいDB2のJDBCで、S2DaoからBigDecimalが・・・

http://d.hatena.ne.jp/htada/20070109/1168346824


先週末、悩んでいた件。
(BEANのプロパティにBigDecimalがある場合、古いDB2JDBCはgetBigDecimal(String columnName)が無くてエラーになっちゃう。)


ResultSetWrapperをキーワードに調べて、解決できました。
ひがさん、アドバイスありがとうございました。


以下、やったこと。
※OracleResultSetFactoryがとても参考になります。

  • ResultSetWrapperを継承して、自分用のResultSetをつくる。

今回は、getBigDecimal(String ColumnName)をオーバーライドしてます。

package package.name;

import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.seasar.extension.jdbc.impl.ResultSetWrapper;

public class OldDB2ResultSet extends ResultSetWrapper {

    public OldDB2ResultSet(ResultSet resultSet) {
        super(resultSet);
    }
    
    public BigDecimal getBigDecimal(String columnName) throws SQLException {
        return new BigDecimal(super.getString(columnName));
    }

}
  • BasicResultSetFactoryを継承して、上記ResultSetを返すFactoryクラスをつくる。
package package.name;

import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.seasar.extension.jdbc.impl.BasicResultSetFactory;

public class OldDB2ResultSetFactory extends BasicResultSetFactory {

    public ResultSet createResultSet(PreparedStatement ps) {
        return new OldDB2ResultSet(super.createResultSet(ps));
    }
}
  • jdbc.diconを書き換える。

既存で有効になっているResultSetFactoryをコメントアウトして、上記でつくったResultSetFactoryを設定。

<!-- <component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/> -->
<component class="package.name.OldDB2ResultSetFactory"/>


以上の3つで、動くようになりました。