DbUtils组件的整个代码结构做了一个简单的疏导,现在来看看一些比较核心的接口:
1)RowProcessor
- /**
- * RowProcessor的实现类将ResultSet转换为其它的各种对象.
- * 具体的实现细节可查看:BasicRowProcessor
- */
- public interface RowProcessor {
- /**
- * 通过指定有效的ResultSet对象,创建一个Object[].
- * ResultSet在传入这个方法之前,必须指定一个有效的位置,
- * 这个方法的实现必须不能改变ResultSet的行位置
- * @param rs 要转换为数组的ResultSet
- * @throws SQLException 数据访问异常
- * @return 创建的一个新的数组
- */
- public Object[] toArray(ResultSet rs) throws SQLException;
- /**
- * 通过指定有效的ResultSet,创建一个JavaBean实例.
- * ResultSet在传入这个方法之前,必须指定一个有效的位置,
- * 这个方法的实现必须不能改变ResultSet的行位置
- * @param <T> 创建的bean的类型
- * @param rs 同上
- * @param type 创建bean实例的类
- * @throws SQLException 同上
- * @return 创建的一个新的实例对象
- */
- public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException;
- /**
- * 通过遍历ResultSet,创建一个bean集合,
- * 在执行这个方法之前,不能调用ResultSet.next()方法。
- * @param <T> 同上
- * @param rs 同上
- * @param type 同上
- * @throws SQLException 同上
- * @return 指定类型的bean集合
- */
- public <T> List<T> toBeanList(ResultSet rs, Class<T> type) throws SQLException;
- /**
- * 将指定的ResultSet行转换为一个Map。
- * 必须指定一个有效的位置传入该方法.
- * 该方法的实现必须保证不改变ResultSet的行位置
- * @param rs 同上
- * @throws SQLException 同上
- * @return 新创建的Map集合
- */
- public Map<String, Object> toMap(ResultSet rs) throws SQLException;
- }
这个呢,是 DbUtils组件核心接口之一,也就是真正解析java.sql.ResultSet的接口,当然了,真正做事情的是它的实现类了:BasicRowProcessor,这个类的分析下一节再说,再来看看另一个重要的接口:
2)ResultSetHandler<T>
- /**
- * 该接口实现类将java.sql.ResultSet转换为其它的对象
- */
- public interface ResultSetHandler<T> {
- /**
- *
- * 将java.sql.Result转换为一个对象
- *
- * @param rs 待转换的java.sql.ResultSet
- *
- * @return java.sql.ResultSet转换的对象.
- * 如果ResultSet为空,刚返回一个null
- *
- * @throws SQLException 数据访问异常
- */
- public T handle(ResultSet rs) throws SQLException;
- }
看看这两个接口的说明,有点奇怪对不对,为什么这两个类都说将一个java.sql.ResultSet转换为其它对象呢?
实际上呢,如果你提前看过了它们的实现类,那么你可能就不会那么奇怪了,RowProcessor这个接口,顾名思义啊,它是处理java.sql.ResultSet中单个行的数据的,而我们的数据集怎么可能是只有一条呢,所以,要处理所有的ResultSet里面的数据怎么办?OK,对,ResultSetHandler<T>,如果你对ResultSetHandler<T>的实现类目堵过,那么,你就不难发现,RowProcessor是ResultSetHandler<T>的成员变量,也可以理解为ResultSetHandler<T>的实现类是RowProcessor的包装类。
有点明目没?!
下一节,具体来看里面的实现