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