DBUtils学习笔记一DbUtils

来源:互联网 发布:淘宝账号怎么找回来 编辑:程序博客网 时间:2024/05/20 15:42

DBUtils包是apache commons的一个工具包,主要是用来对jdbc程序的补充与封装,通过简单封装让jdbc程序更简洁,使我们的程序更加的清晰。整个工具包只有不到30个类和接口,但是功能很强大,基本使我们避免了jdbc中的很多繁琐重复的代码,昨天对这个包中的源码进行了阅读与测试,下面对主要常用的API总结一下:

API docs图:





可见其中主要的两个接口ResultSetHandler和RowProcessor都是用来对查询结果记录进行处理的接口,包中很多类都是实现这两个接口来达到其功能的。

一、DbUtils类:

这个类中提供了很多关闭资源、简单事务提交与回滚、以及loadDriver的工具方法。这个类与平时我们自己写的DB工具类差不多,只是没有看到getConnection这样的方法。


  1. 关闭数据库资源方法
    1. 这类方法有两种:close与closeQuietly,每种都有多个重载的方法,源码很简单,就是对jdbc代码的简单封装:
      public static void close(Connection conn) throws SQLException {        if (conn != null) {//简单的判断非null、然后关闭            conn.close();        }    }public static void closeQuietly(ResultSet rs) {        try {            close(rs);        } catch (SQLException e) { // NOPMD            // quiet 捕获异常什么也没做        }    }

    2. 当然这类方法还支持同时关闭多个资源,包括connection、resultset、preparestatment等,使用了嵌套的try catche finally 来保证资源的关闭。
  2. 简单事务操作方法
    1. 提交和回滚事务操作,都是简单的判断connection是否为空,执行相应的提交回滚操作,并关闭链接,像close方法一样这两个方法也有quietly的方法,操作类似:
      public static void commitAndClose(Connection conn) throws SQLException {        if (conn != null) {            try {                conn.commit();            } finally {                conn.close();            }        }    }public static void rollbackAndClose(Connection conn) throws SQLException {        if (conn != null) {            try {                conn.rollback();            } finally {                conn.close();            }        }    }

  3. 加载Driver方法
    1. loadDriver方法也有一个重载的实现,一个直接使用默认的加载器加载Driver另一个可以提供一个ClassLoader参数来加载Driver:
      public static boolean loadDriver(String driverClassName) {        return loadDriver(DbUtils.class.getClassLoader(), driverClassName);    }public static boolean loadDriver(ClassLoader classLoader, String driverClassName) {        try {            Class<?> loadedClass = classLoader.loadClass(driverClassName);            if (!Driver.class.isAssignableFrom(loadedClass)) {                return false;            }            @SuppressWarnings("unchecked") // guarded by previous check            Class<Driver> driverClass = (Class<Driver>) loadedClass;            Constructor<Driver> driverConstructor = driverClass.getConstructor();            // make Constructor accessible if it is private            boolean isConstructorAccessible = driverConstructor.isAccessible();            if (!isConstructorAccessible) {                driverConstructor.setAccessible(true);            }            try {                Driver driver = driverConstructor.newInstance();//通过反射的方式来创建Driver实例,调用了一个内部私有类来注册Driver                registerDriver(new DriverProxy(driver));            } finally {                driverConstructor.setAccessible(isConstructorAccessible);            }            return true;        } catch (RuntimeException e) {            return false;        } catch (Exception e) {            return false;        }    }

  4. 打印信息方法:
    1. 这些方法主要是用来打印异常信息的,可以指定输出的printwriter等,没做过多研究,没怎么使用过。

这个类可以与我们自己实现的一个DbTools类一起配合使用简化jdbc代码,这样基本的jdbc常用的功能就全了:

/** * Created by weiguang on 16-8-15. */public final class DbTools {    private static final Logger logger = LoggerFactory.getLogger(DbTools.class);    private static String username;    private static String password;    private static String jdbcUrl;    private static String driverClass;    static {        InputStream in = DbTools.class.getClassLoader().getResourceAsStream("db.properties");        Properties props = new Properties();        try {            props.load(in);        } catch (IOException e) {            logger.error("db.properties 文件加载失败!!", e);        }        username = props.getProperty("username");        password = props.getProperty("password");        jdbcUrl = props.getProperty("jdbcUrl");        driverClass = props.getProperty("driverClass");//        使用DBUtils包中的工具类避免捕获异常,是代码更整洁        DbUtils.loadDriver(driverClass);    }    public static Connection getConnection() {        try {            return DriverManager.getConnection(jdbcUrl, username, password);        } catch (SQLException e) {            logger.error("获取数据库链接失败!", e);        }        return null;    }}




0 0
原创粉丝点击