阅读 dbutils 源码(一)
目录文件介绍
package-info
此文件为包级文档和包级别注释提供一个地方,文件内必须包含包声明。
比如你想弃用一个包中的所有类型。你可以通过使用@Deprecated
注解每个单独的类型,或者,你可以在package-info.java
中的package
声明上使用@Deprecated
。META-INF.services
此目录下文件名为接口,内容为此接口的实现类,ServiceLoader加载某个接口的实现类集合会用到此目录下的文件。changes
我猜是用来记录整个项目的修改日志的。site
我猜是用来生成项目相关web页面。- 根目录下其他文件不影响阅读源码,忽略。
接口
ColumnHandler 将结果集中的列转成对应的java类型
boolean match(Class<?> propType);
Object apply(ResultSet rs, int columnIndex) throws SQLException;
PropertyHandler 将值转成对应的java类型
boolean match(Class<?> parameter, Object value);
Object apply(Class<?> parameter, Object value);
ResultSetHandler 将结果集中的数据转成对应的java bean对象
T handle(ResultSet rs) throws SQLException;
RowProcessor 将结果集中多行记录转换成多个对象
Object[] toArray(ResultSet rs) throws SQLException;
<T> T toBean(ResultSet rs, Class<? extends T> type) throws SQLException;
<T> List<T> toBeanList(ResultSet rs, Class<? extends T> type) throws SQLException;
Map<String, Object> toMap(ResultSet rs) throws SQLException;
ColumnHandler 接口实现
- BooleanColumnHandler
- ByteColumnHandler
- DoubleColumnHandler
- FloatColumnHandler
- IntegerColumnHandler
- LongColumnHandler
- ShortColumnHandler
- SQLXMLColumnHandler
- StringColumnHandler
- TimestampColumnHandler
实现类做的工作都比较简单,判断类型和取值,以BooleanColumnHandler为例:
public class BooleanColumnHandler implements ColumnHandler {
@Override
public boolean match(final Class<?> propType) {
// 当propType是Boolean或者boolean类型时,返回true
return propType.equals(Boolean.TYPE) || propType.equals(Boolean.class);
}
@Override
public Object apply(final ResultSet rs, final int columnIndex) throws SQLException {
// 将第columnIndex列取出并转换成Boolean类型
return Boolean.valueOf(rs.getBoolean(columnIndex));
}
}
要注意一下String
、SQLXML
和Timestamp
,这三种类型没有对应的简单类型,所以从结果集中取出来以后直接返回就行了。
PropertyHandler 接口实现
- DatePropertyHandler
StringEnumPropertyHandler
java.sql.Date
、java.sql.Time
和java.sql.Timestamp
均是java.util.Date
的子类。
java.sql.Timestamp
转换时纳秒要单独取值赋值,不然可能会有精度损失。Class.isEnum()
当且仅当这个类被声明为在源代码中的枚举此方法返回 true。
a.isAssignableFrom(b)
a与b类型相同或者a是b的父类或父接口。
parameter.asSubclass(Enum.class)
将这个类强制转为另一个类的子类(这个方法还不太懂)。RowProcessor 接口实现
BasicRowProcessor
BeanProcessor defaultConvert = new BeanProcessor();
默认的bean加工类。
BasicRowProcessor instance = new BasicRowProcessor();
用到instance
的方法过时了,所以暂时以为它没用。
private static class CaseInsensitiveHashMap extends LinkedHashMap<String, Object>
忽略大小写的map
。
ResultSetMetaData meta = rs.getMetaData()
获取结果集的结构,如字段数、字段名、别名等。
toArray
和toMap
在这里实现了,toBean
和toBeanList
是调用的BeanProcessor
的对象实现的。