日期:2014-05-16  浏览次数:20424 次

Commons DbUtils 源码阅读六

?DbUtils组件的核心部分已经解析完了,实际上呢,DbUtils组件还有其它很多有用对JDBC的包装类,所以呢,在这篇博文里一一介绍:

? 1)DbUtils :JDBC辅助方法的集合类,它里面的方法全部是静态,实际上就是一针对JDBC的辅助操作集合类。该类的实现也是比较的简单的,比如JDBC驱动程序加载、JDBC各类接口连接的关闭等等。现在我抽取部分具有代表性的代码来进行解析:

?

    /**
     * 关于数据连接实例Connection,如果Connection为空则不做任何操作
     * @param conn 待关闭的Connection.
     * @throws SQLException 数据库访问异常
     */
    public static void close(Connection conn) throws SQLException {
        if (conn != null) {
            conn.close();
        }
    }

    /**
     * 关于数据连接实例Connection,隐藏任何抛出的SQLException。
     * 如果Connection为空则不做任何操作
     * @param conn 待关闭的Connection.
     */
    public static void closeQuietly(Connection conn) {
        try {
            close(conn);
        } catch (SQLException e) {
            // quiet
        }
    }


    /**
     * 加载注册数据驱动类.
     * 如果加载成功,则会返回true,否则返回false.
     *
     * @param driverClassName 加载的驱动类名
     * @return boolean 如果驱动程序加载成功返回true,否则返回false.
     */
    public static boolean loadDriver(String driverClassName) {
        try {
            Class.forName(driverClassName).newInstance();
            return true;

        } catch (ClassNotFoundException e) {
            return false;

        } catch (IllegalAccessException e) {
            // Constructor is private, OK for DriverManager contract
            return true;

        } catch (InstantiationException e) {
            return false;

        } catch (Throwable e) {
            return false;
        }
    }

?? 看,传说中的关闭数据连接Connection,隐藏异常就是吞异常不捕获噢,哈哈哈~OK,DbUtils这个JDBC帮助类的解析到此为止。

? 2)ProxyFactory :创建JDBC接口的代理实现类。这个类避免了JDBC2和JDBC3接口之间的不兼容。记住,只是针对JDBC中的接口创建的代理哟。

?

    /**
     * 创建一个新的Connection代理对象。
     * @param handler 调用拦截/重载类的处理器
     * @return 代理的ResultSet实例
     */
    public ResultSet createResultSet(InvocationHandler handler) {
        return newProxyInstance(ResultSet.class, handler);
    }
    
    /** 
     * 使用处理类的加载器产生一个独立接口的代理类的便利方法
     * @param <T> 需要代理的对象类型
     * @param type 代理的对象类型
     * @param handler  拦截/重写方法调用的处理程序	
     * @return proxied object
     */
    public <T> T newProxyInstance(Class<T> type, InvocationHandler handler) {
        return type.cast(Proxy.newProxyInstance(handler.getClass().getClassLoader(), new Class<?>[] {type}, handler));
    }

?? 这个类的关键了,就是newProxyInstance方法了,它有两个参数,第二个参数是InvocationHandler的实现类,它是指定代理对象类型的处理方式,首先调用Proxy.newProxyInstance()生成代理类,然后再调用Class类的cast()方法转换成代理类。由此实现不难看出,只针对JDBC的接口实现代理。

?

?

?

?