将数据库表的结果解析为泛型集合

时间:2014-07-05 13:19:19

标签: java generics collections

我在Java中有一个解析数据库中某些数据的方法

ArrayList<Object> nodeList = new ArrayList<Object>();

public void parseResults() throws SQLException, ListEmptyException, NoRecognisableCharacterException{
//        parses records from a query. ONLY ONE COLUMN
    while(getResultSet().next()){    
        for(int i = 1; i <= getNumberOfColumns(); i++){
            switch(getColumnType()){
//According to the datatype, I call the proper method get[DataType] of resultSet
                case 0:throw new ListEmptyException();
                case 4:nodeList.add(getResultSet().getInt(i));break;
                case 12:nodeList.add(getResultSet().getString(i).trim());break;
                default:throw new NoRecognisableCharacterException();
            }
        }
    }
}

我被告知不要使用ArrayList<Object>来存储不同类型的数据。我必须创建一个解析相应数据类型的实体。我不想为每个单一数据类型(有很多)重载方法,既不创建仅更改单个get[DataType]方法的单独类,也不要在switch循环内创建for循环,根据数据类型也没有nodeList的多个实例。有没有办法让该方法适用于每种数据类型?在这种情况下,仿制药应该做吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

您可以将结果集对象包装在这样的类中:

public class ObjectWrapper implements Wrapper {
    private Object wrappedObject;

    public ObjectWrapper(Object wrappedObject) {
        this.wrappedObject = wrappedObject;
    }

    @SuppressWarnings("unchecked")
    public <T> T unwrap(Class<T> paramClass) {
        return (T) wrappedObject;
    }

    public boolean isWrapperFor(Class<?> paramClass) {
        return paramClass.isInstance(wrappedObject);
    }

    public static Wrapper wrap(ResultSet rs, int column, int columnType) throws SQLException {
        if (columnType == 0) {
            return new EmptyListExceptionWrapper();
        } else {
            return new ObjectWrapper(rs.getObject(column));
        }
    }
}

和管理例外的类:

public class EmptyListExceptionWrapper implements Wrapper {
    @Override
    public <T> T unwrap(Class<T> paramClass) throws SQLException {
        return null;
    }

    @Override
    public boolean isWrapperFor(Class<?> paramClass) throws SQLException {
        return false;
    }
}

然后你有一个

ArrayList<Wrapper> wrapper = new ArrayList<Wrapper>;

您的代码将是:

while(getResultSet().next()){    
    for(int i = 1; i <= getNumberOfColumns(); i++){
        wrappers.add(ObjectWrapper.wrap(getResultSet(), i, getColumnType()));
    }
}