Commons DbUtils 源码阅读六

本文详细解析了DbUtils组件中的关键方法,如关闭数据库连接并处理异常等,并介绍了ProxyFactory类如何为JDBC接口创建代理实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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的接口实现代理。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值