阅读 dbutils 源码(一)

阅读 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));
    }
}

要注意一下StringSQLXMLTimestamp,这三种类型没有对应的简单类型,所以从结果集中取出来以后直接返回就行了。

PropertyHandler 接口实现

  • DatePropertyHandler
  • StringEnumPropertyHandler

    java.sql.Datejava.sql.Timejava.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()获取结果集的结构,如字段数、字段名、别名等。

toArraytoMap在这里实现了,toBeantoBeanList是调用的BeanProcessor的对象实现的。

附上我的github地址,dbutils源码和我自己加的注解。

猜你喜欢

转载自blog.csdn.net/m0_37659871/article/details/81381739