[Seasar-user:992] 既存のインスタンスに結果をセットするBeanResultSetHandler

NAKAMURA Manabu under_the_starry
2004年 9月 7日 (火) 23:11:01 JST


初めまして。中村 学と申します。
以後お見知りおき下さい。

現在 S2 ベースでアプリケーションを作成しているのですが、
S2JDBC の BeanResultSetHandler で、新規にインスタンスを生成するのではなく、
既存のインスタンスに結果をセットするものが欲しくなったので作成してみました。

少しでも共有できればと思いポストします。
# ここにはあまりこういうものは投げない方がいいですか?
本家に取り込まれれば嬉しいですが、用途が限定的すぎるんで微妙ですね。
こういう拡張を放り込めるパッケージがあって、
ライブラリ化していければ良いのかもしれません。

-------------------------------------------------------------------------------
import java.sql.ResultSet;
import java.sql.SQLException;

import org.seasar.extension.jdbc.PropertyType;
import org.seasar.extension.jdbc.ValueType;
import org.seasar.extension.jdbc.impl.AbstractBeanResultSetHandler;
import org.seasar.framework.beans.PropertyDesc;

public class InstanceAssignedBeanResultSetHandler
        extends AbstractBeanResultSetHandler {

    protected Object bean;
    
    public InstanceAssignedBeanResultSetHandler(Object bean) {
        super(bean.getClass());
        this.bean = bean;
    }

    public Object handle(ResultSet rs) throws SQLException {
        if (rs.next()) {
            return createRow(rs, createPropertyTypes(rs.getMetaData()));
        } else {
            return bean;
        }
    }

    protected Object createRow(ResultSet rs, PropertyType[] propertyTypes)
            throws SQLException {
        for (int i = 0; i < propertyTypes.length; ++i) {
            PropertyType pt = propertyTypes[i];
            ValueType valueType = pt.getValueType();
            Object value = valueType.getValue(rs, i + 1);
            PropertyDesc pd = pt.getPropertyDesc();
            pd.setValue(bean, value);
        }
        return bean;
    }

    public void setBean(Object bean) {
        setBeanClass(bean.getClass());
        this.bean = bean;
    }

    public Object getBean() {
        return bean;
    }
}
-------------------------------------------------------------------------------

また、これを作成していて、AbstractBeanResultSetHandler#createRow() が
こんな形になってるとコードの重複が減らせるので嬉しいなーと思いました。

protected Object createRow(ResultSet rs, PropertyType[] propertyTypes)
        throws SQLException {
    Object row = ClassUtil.newInstance(beanClass_);
    setResultToBean(row, rs, propertyTypes);
    return row;
}
protected void setResultToBean(Object bean, ResultSet rs, PropertyType[] propertyTypes)
        throws SQLException {
    for (int i = 0; i < propertyTypes.length; ++i) {
        PropertyType pt = propertyTypes[i];
        ValueType valueType = pt.getValueType();
        Object value = valueType.getValue(rs, i + 1);
        PropertyDesc pd = pt.getPropertyDesc();
        pd.setValue(row, value);
    }
}

ご考慮頂ければ幸いです。
宜しくお願い致します。

--------------------------------------
 中村 学/NAKAMURA Manabu
 [E-MAIL ADDRESS DELETED]
--------------------------------------





Seasar-user メーリングリストの案内