DbUtils源码分析-DBUtils类

原创 2018年04月14日 22:55:43

1. DbUtils类简介

DbUtils是一个简单的一个数据库帮助类
主要包含了:

  • Connection,Statement,ResultSet资源的关闭,
  • Connection提交,回滚
  • 异常/警告的输出
  • 加载驱动
  • 静态内部类DriverProxy

2. 方法

2.1 构造函数

public DbUtils() {
        // do nothing
}

2.2 close方法

在每个资源close之前都会判断是否已经关闭,防止因为重复关闭出错

public static void close(Connection conn) throws SQLException {
    if (conn != null) {
        conn.close();
    }
}
public static void close(ResultSet rs) throws SQLException;
public static void close(Statement stmt) throws SQLException;

2.3 closeQuickly方法

和close方法类似,只是在内部调用close方法,且在方法内部捕获了异常,提供一次关闭多个资源的方法

public static void closeQuietly(Connection conn, Statement stmt, ResultSet rs) {
        try {
            closeQuietly(rs);
        } finally {
            try {
                closeQuietly(stmt);
            } finally {
                closeQuietly(conn);
            }
        }

    }
    public static void closeQuietly(Connection conn);
    public static void closeQuietly(ResultSet rs);
    public static void closeQuietly(Statement stmt);

2.4 提交/回滚事务

提交后会关闭资源

 public static void commitAndClose(Connection conn) throws SQLException {
        if (conn != null) {
            try {
                conn.commit();
            } finally {
                conn.close();
            }
        }
    }
     public static void commitAndCloseQuietly(Connection conn) {
        try {
            commitAndClose(conn);
        } catch (SQLException e) { // NOPMD
            // quiet
        }
    }
    public static void rollback(Connection conn) throws SQLException {
        if (conn != null) {
            conn.rollback();
        }
    }
    public static void rollbackAndClose(Connection conn) throws SQLException;
    public static void rollbackAndCloseQuietly(Connection conn);

2.5 加载驱动

public static boolean loadDriver(ClassLoader classLoader, String driverClassName) {
        try {
            Class<?> loadedClass = classLoader.loadClass(driverClassName);
            if (!Driver.class.isAssignableFrom(loadedClass)) {
                return false;
            }
            @SuppressWarnings("unchecked")
            Class<Driver> driverClass = (Class<Driver>) loadedClass;
            //获取驱动的构造函数
            Constructor<Driver> driverConstructor = driverClass.getConstructor();
            //构造函数是私有的者设置可访问性为true
            boolean isConstructorAccessible = driverConstructor.isAccessible();
            if (!isConstructorAccessible) {
                driverConstructor.setAccessible(true);
            }
            //实例化驱动
            try {
                Driver driver = driverConstructor.newInstance();
                //注册驱动
                registerDriver(new DriverProxy(driver));
            } finally {
                driverConstructor.setAccessible(isConstructorAccessible);
            }
            return true;
        } catch (RuntimeException e) {
            return false;
        } catch (Exception e) {
            return false;
        }
    }
    public static boolean loadDriver(String driverClassName);

2.6 输出异常

    public static void printStackTrace(SQLException e, PrintWriter pw) {
      SQLException next = e;
        while (next != null) {
            next.printStackTrace(pw);
            next = next.getNextException();
            if (next != null) {
                pw.println("Next SQLException:");
            }
        }
    }
    public static void printStackTrace(SQLException e);

    public static void printWarnings(Connection conn, PrintWriter pw) {
        if (conn != null) {
            try {
                printStackTrace(conn.getWarnings(), pw);
            } catch (SQLException e) {
                printStackTrace(e, pw);
            }
        }
    }
    public static void printWarnings(Connection conn);

2.7 静态内部类DriverProxy

这个除了自定义一个字节的方法外,其余方法都是在显示接口方法的基础上直接调用接口方法,不是很懂这个类的作用

private static final class DriverProxy implements Driver {
        private boolean parentLoggerSupported = true;
        private final Driver adapted;
        public DriverProxy(Driver adapted) {
            this.adapted = adapted;
        }
        @Override
        public boolean acceptsURL(String url) throws SQLException {
            return adapted.acceptsURL(url);
        }
        @Override
        public Connection connect(String url, Properties info) throws SQLException {
            return adapted.connect(url, info);
        }
        @Override
        public int getMajorVersion() {
            return adapted.getMajorVersion();
        }
        @Override
        public int getMinorVersion() {
            return adapted.getMinorVersion();
        }
        @Override
        public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException {
            return adapted.getPropertyInfo(url, info);
        }
        @Override
        public boolean jdbcCompliant() {
            return adapted.jdbcCompliant();
        }

        /**
         * Java 1.7 method.
         */
        public Logger getParentLogger() throws SQLFeatureNotSupportedException {
            if (parentLoggerSupported) {
                try {
                    Method method = adapted.getClass().getMethod("getParentLogger", new Class[0]);
                    return (Logger)method.invoke(adapted, new Object[0]);
                } catch (NoSuchMethodException e) {
                    parentLoggerSupported = false;
                    throw new SQLFeatureNotSupportedException(e);
                } catch (IllegalAccessException e) {
                    parentLoggerSupported = false;
                    throw new SQLFeatureNotSupportedException(e);
                } catch (InvocationTargetException e) {
                    parentLoggerSupported = false;
                    throw new SQLFeatureNotSupportedException(e);
                }
            }
            throw new SQLFeatureNotSupportedException();
        }

    }
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33061377/article/details/79945366

数据库编程JDBC&连接池&dbutils;&dbcp;&c3p0;

-
  • 1970年01月01日 08:00

DBUtils源码分析

其实,在这篇文章里,我只是分析了dbutis的query的运作流程类。 至于类为什么要这样设计,蕴含的设计模式等等高级知识点咱们在下节再探讨。 先看看最简单的DBUtils是如何工作的。  数据库里...
  • dlf123321
  • dlf123321
  • 2015-04-21 16:45:49
  • 1673

DbUtils源码分析系列(一)

DbUtils源码结构DbUtils当前版本是1.6, 源码下载地址:http://commons.apache.org/proper/commons-dbutils/download_dbutil...
  • Zhang_Kai_123
  • Zhang_Kai_123
  • 2015-04-11 19:34:38
  • 952

dbutils框架

  • 2014年07月29日 11:32
  • 798KB
  • 下载

DbUtils源码解析

前言1.为什么分析DbUtils 序号 reason 1 dbutils是对jdbc的一个简单的封装,分析...
  • olddevil
  • olddevil
  • 2015-12-02 17:17:33
  • 310

dbutils源代码

  • 2014年05月16日 19:38
  • 140KB
  • 下载

Apache DbUtils 源码分析 | Apache DbUtils Source Code Analysis

本文转自:点击打开链接 上一篇文章Apache DbUtils 使用教程详细讲解了DbUtils的特性和使用方法,如果你厌倦了Hibernate的笨重,也不想用IBatis,...
  • zhuyucheng123
  • zhuyucheng123
  • 2014-07-26 18:29:11
  • 1965

python学习---3(DBUtils.PooledDB)

#-*- coding: utf-8 -*- """ 数据库管理类 """ import MySQLdb from DBUtils.PooledDB import PooledDB #自定义的配置文件...
  • amandaxy
  • amandaxy
  • 2012-03-07 11:12:29
  • 7066

Python数据库连接池DBUtils.PooledDB

1. 未使用连接池连接mysqlimport MySQLdb conn = MySQLdb.connect(host = '127.0.0.1', user ='user1', passwd = 'y...
  • u010472499
  • u010472499
  • 2017-10-09 15:19:16
  • 93

DBUtils_PooledDB

DBUtils 是一套用于管理数据库连接池的包,为高频度高并发的数据库访问提供更好的性能,可以自动管理连接对象的创建和释放。最常用的两个外部接口是 PersistentDB 和 PooledDB,...
  • guzicheng
  • guzicheng
  • 2010-09-21 13:29:00
  • 1927
收藏助手
不良信息举报
您举报文章:DbUtils源码分析-DBUtils类
举报原因:
原因补充:

(最多只允许输入30个字)