日期:2014-05-16  浏览次数:20564 次

Commons DbUtils 源码阅读三

? 前两天着实被javaeye关闭着急了一下,还好,总算开放了!

? 继续我们的DbUtils组件的阅读研究吧。

??RowProcessor的实现子类:BasicRowProcessor

????

/**
 * RowProcessor接口的实现类
 */
public class BasicRowProcessor implements RowProcessor {

    /**
     * 默认转换器
     * 如果没有指定,则使用这个进行resultSet的转换
     */
    private static final BeanProcessor defaultConvert = new BeanProcessor();

    private static final BasicRowProcessor instance = new BasicRowProcessor();

    /**
     * 返回BasicRowProcessor的单实例
     * 过期方法,建议使用构造器创建对象,这个方法将在DbUtils 1.1中去掉
     * @return 这个类的单实例.
     * @deprecated
     */
    public static BasicRowProcessor instance() {
        return instance;
    }

    /**
     * 使用这个实例来进行bean的转换
     */
    private final BeanProcessor convert;

    /**
     * BasicRowProcessor构造器.
	 * 默认使用BeanProcessor转换
     */
    public BasicRowProcessor() {
        this(defaultConvert);
    }
    
    /**
     * BasicRowProcessor构造器.
     * @param convert 当需要将表属性名转换为bean属性时要使用的BeanProcessor实例
     * @since DbUtils 1.1
     */
    public BasicRowProcessor(BeanProcessor convert) {
        super();
        this.convert = convert;
    }

    /**
     * 将ResultSet的一行转换为一个Object[]数组
     * 这个实现将ResultSet中的数据顺序的存入数组.
     * 如果列值为NULL,则数组元素设置为null.
     */
    public Object[] toArray(ResultSet rs) throws SQLException {
        ResultSetMetaData meta = rs.getMetaData();//获取ResultSet的MetaData对象
        int cols = meta.getColumnCount();//获取列数
        Object[] result = new Object[cols];

        for (int i = 0; i < cols; i++) {
            result[i] = rs.getObject(i + 1);//获取每列对应的值,并赋给新数组
        }

        return result;
    }

    /**
     * 将ResultSet的指定行转换为一JavaBean.
	 * 这个实现代理需要一个BeanProcessor实例.
     * 具体的可参见:BeanProcessor的toBean(java.sql.ResultSet, java.lang.Class)方法
     */
    public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException {
        return this.convert.toBean(rs, type);
    }

    /**
     * 将ResultSet的指定行转换为一JavaBean集合.  
     * 该方法同样需要一个BeanProcessor实例 
     * 具体的可参见:BeanProcessor的toBeanList(java.sql.ResultSet, java.lang.Class)方法
     */
    public <T> List<T> toBeanList(ResultSet rs, Class<T> type) throws SQLException {
        return this.convert.toBeanList(rs, type);
    }

    /**
     * 将指定的ResultSet行转换为一个Map
     * 这个实现返回一个以大小写无关的列名为键值的Map集合 
     * 例如:调用map.get("COL")或者map.get("col")返回相同的值.
     */
    public Map<String, Object> toMap(ResultSet rs) throws SQLException {
        Map<String, Object> result = new CaseInsensitiveHashMap();//创建一个自定义的大小写无关的Map实例
        ResultSetMetaData rsmd = rs.getMetaData();
        int cols = rsmd.getColumnCount();

        for (int i = 1; i <= cols; i++) {
            result.put(rsmd.getColumnName(i), rs.getObject(i));//这一用法就是将列名为键值
        }

        return result;
    }
}

?

? BasicRowProcessor这个类实现了RowProcessor接口的ResultSet转换为其它对象的方法,现对这个类的几点具体说明如下:

????? 1)

??????

public Object[] toArray(ResultSet rs) throws SQLException 

??? 这个方法也实在是没啥好说的,一切尽在掌握,很直白,就是利用ResultSet的MetaData对象来对当前行进行数据的处理操作,最后存入一数组对象,所以,略过!

??? 2)

????

    public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException {
        return this.convert.toBean(rs, type);
    }

    public <T> List<T> toBeanList(ResultSet rs, Class<T> type) throws SQLException {
        return this.convert.toBeanList(rs, type);
    }

??这两个方法之所以会要一起列出来,主要是出于以下几个原因的考虑,一点是,它们都需要一个BeanProcessor实例来对ResultSet进行处理;另一点则是,我不想把对这两个的分析放在这里,而是想考虑放到下一节:BeanProcessor的分析(对BeanProcessor的分析也会碰到一新东西,那就是Java的内省Introspector,挺有意思的一知识点,你,值得期待)。实际上呢,我们通过对BasicRowProcessor的分析,我们也可以知道,它默认是采用这个BeanProcessor来处理ResultSet的。

?????3)???????

public Map<String, Object> toMap(ResultSet rs) throws SQLException

?

???根据这个方法的注释说明,它根据列名获取值,是大小写无关的,实际上一般的Map不