日期:2014-05-16 浏览次数:20564 次
? 前两天着实被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不