JDBCUtils 工具类

来源:互联网 发布:2017网络新歌排行榜 编辑:程序博客网 时间:2024/06/11 06:55

/**

本博客由马瘦风整理并发布,创作不易,转载请注明出处:

http://blog.csdn.net/ma_shou_feng

*/

1. 工具类设计细节

1.1 关于异常:

工具类是为开发提供便捷而设计的,若工具类内部出现异常,最好是将异常抛出,强迫调用者去处理,否则出现问题很难发现。

——告诉调用者,将要使用的方法有可能出现问题。

虽说抛出运行时异常,调用者可处理也可不处理,更加灵活,但这无形中增加了程序的维护难度。

1.2 具体实践细节:

一般的工具类都没有必要被继承,因此加上 final 属性:

public  final  class XxxUtil{...}
同样的,工具类被实例化的需求也并不多见,故将其构造方法私有化:
private  XxxUtil(){};

2. JDBCUtils 的具体实现

/**   * JDBC 工具类   * @author healchow   */    public final class JDBCUtils {        // 创建私有的静态线程局部类对象,确保线程与 Connection 对象绑定在一起        private static ThreadLocal<Connection> local = new ThreadLocal<Connection>();        // 创建私有的公共静态数据源对象        private static DataSource dataSource = new ComboPooledDataSource();            /**      * 不允许创建工具类实例      */        private JDBCUtils() {}            /**      * 获取数据源对象      * @return DataSource对象      */        public static DataSource getDataSource() {            return dataSource;        }            /**      * 获取连接对象      * @return Connection对象      */        public static Connection getConnection() {            try {                // 从线程局部类对象中获取连接对象                Connection conn = local.get();                // 如果没有获取到,则新创建一个连接对象                if (conn == null) {                    // 新建连接对象,并将其添加至线程局部对象                    conn = dataSource.getConnection();                    local.set(conn);                }                return conn;            } catch (SQLException e) {                //将编译时异常转换为运行时异常                throw new RuntimeException(e);            }        }            /**      * 开启事务      */        public static void beginTransaction() {            try {                //调用本类方法获取连接对象                Connection conn = getConnection();                if(conn != null) {                    conn.setAutoCommit(false);                }            } catch (SQLException e) {                e.printStackTrace();                throw new RuntimeException();            }        }            /**      * 提交事务      */        public static void commitAndRelease() {            try {                //提交事务,并关闭连接对象                Connection conn = getConnection();                if(conn != null) {                    conn.commit();                    conn.close();                    //将连接对象从 local 中移除                    local.remove();                }            } catch (SQLException e) {                e.printStackTrace();                throw new RuntimeException(e);            }        }            /**      * 回滚事务      */        public static void rollbackAndRelease() {            try {                // 回滚事务,并关闭连接对象                Connection conn = getConnection();                //DbUtils.rollbackAndCloseQuietly(conn);                if(conn != null) {                    conn.rollback();                    conn.close();                    //将连接对象从 local 中移除                    local.remove();                }            } catch (SQLException e) {                e.printStackTrace();                throw new RuntimeException(e);            }        }            /**      * 关闭各类资源      * @param rs      * @param stmt      * @param conn      */        public static void close(ResultSet rs, Statement stmt, Connection conn) {            try {                if (rs != null)                    rs.close();            } catch (SQLException e) {                e.printStackTrace();            }            try {                if (stmt != null)                    stmt.close();            } catch (SQLException e) {                e.printStackTrace();            }            try {                if (conn != null)                    conn.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        // 关闭资源(只关Statement 和 Connection)        public static void close(Statement stmt, Connection conn) {        close(null, stmt, conn);    }        //关闭资源(只关Connection)     public static void close(Connection conn) {         close(null, null, conn);    }}
原创粉丝点击