天天看點

自己實作的JDBC工具類

最近做了個背景應用程式,剛開始用Spring+iBatis來做的,後來因為種種原因,不讓用Spring、iBatis以及一些開源的工具包。

于是用JDBC重寫了原來的Service實作,項目做完了。

這個JDBC是以前業餘時候寫的,主要針對沒有事物控制的應用,比如MySQL的一些應用。現在放出來大家評論評論不足,也好改進改進。

jdbc.properties

jdbc.url=jdbc:mysql://192.168.1.101:3306/testdb?autoReconnect=true&zeroDateTimeBehavior=convertToNull 

jdbc.username=root 

jdbc.password=leizhimin

DBToolkit.java

package lavasoft.common; 

import org.apache.commons.logging.Log; 

import org.apache.commons.logging.LogFactory; 

import java.io.IOException; 

import java.sql.*; 

import java.util.List; 

import java.util.Properties; 

/** 

* JDBC工具類 

* @author leizhimin 2009-11-24 9:28:03 

*/ 

public class DBToolkit { 

        private static final Log log = LogFactory.getLog(DBToolkit.class); 

        private static String url = null; 

        private static String username = null; 

        private static String password = null; 

        private static Properties props = new Properties(); 

        static { 

                try { 

                        props.load(DBToolkit.class.getResourceAsStream("/jdbc.properties")); 

                } catch (IOException e) { 

                        log.error("#ERROR# :系統加載sysconfig.properties配置檔案異常,請檢查!", e); 

                } 

                url = (props.getProperty("jdbc.url")); 

                username = (props.getProperty("jdbc.username")); 

                password = (props.getProperty("jdbc.password")); 

                //注冊驅動類 

                        Class.forName("com.mysql.jdbc.Driver"); 

                } catch (ClassNotFoundException e) { 

                        log.error("#ERROR# :加載資料庫驅動異常,請檢查!", e); 

        } 

        /** 

         * 建立一個資料庫連接配接 

         * 

         * @return 一個資料庫連接配接 

         */ 

        public static Connection getConnection() { 

                Connection conn = null; 

                //建立資料庫連接配接 

                        conn = DriverManager.getConnection(url, username, password); 

                } catch (SQLException e) { 

                        log.error("#ERROR# :建立資料庫連接配接發生異常,請檢查!", e); 

                return conn; 

         * 在一個資料庫連接配接上執行一個靜态SQL語句查詢 

         * @param conn            資料庫連接配接 

         * @param staticSql 靜态SQL語句字元串 

         * @return 傳回查詢結果集ResultSet對象 

        public static ResultSet executeQuery(Connection conn, String staticSql) { 

                ResultSet rs = null; 

                        //建立執行SQL的對象 

                        Statement stmt = conn.createStatement(); 

                        //執行SQL,并擷取傳回結果 

                        rs = stmt.executeQuery(staticSql); 

                        log.error("#ERROR# :執行SQL語句出錯,請檢查!\n" + staticSql, e); 

                return rs; 

         * 在一個資料庫連接配接上執行一個靜态SQL語句 

        public static void executeSQL(Connection conn, String staticSql) { 

                        stmt.execute(staticSql); 

         * 在一個資料庫連接配接上執行一批靜态SQL語句 

         * @param conn        資料庫連接配接 

         * @param sqlList 靜态SQL語句字元串集合 

        public static void executeBatchSQL(Connection conn, List<String> sqlList) { 

                        for (String sql : sqlList) { 

                                stmt.addBatch(sql); 

                        } 

                        stmt.executeBatch(); 

                        log.error("#ERROR# :執行批量SQL語句出錯,請檢查!", e); 

        public static void closeConnection(Connection conn) { 

                if (conn == null) return; 

                        if (!conn.isClosed()) { 

                                //關閉資料庫連接配接 

                                conn.close(); 

                        log.error("#ERROR# :關閉資料庫連接配接發生異常,請檢查!", e); 

}

這個類的實作中,有幾點說明下:

1、此類沒有執行個體,一切靜态化。

2、此類線程安全。

3、此類将資料庫連接配接交給了使用者去控制,提高連接配接的使用率,正常的做法是每個SQL執行完成後,做一個關閉操作。

通過此類,實作了原來iBatis實作的DAO和Service,因為傳遞了連接配接,改用JDBC實作時候去掉了DAO層,隻有Service層,Service中的每個操作資料庫的方法都會接收一個資料庫連接配接參數。 以友善更高層對Connection的利用,最大限度的利用資料庫連接配接,進而提高系統的效率。

4、此類SQL異常時候,使用者還有機會去關閉資料庫連接配接。

5、此類沒有事物控制,如果需要的話,可以在Service此工具類中跑出SQLException,然後在Service中調用的時候進行控制,一旦發生異常,則復原。一切都交給開發者自行處理控制,相比架構式的一刀切更能靈活控制事物,并能最大限度利用資料庫連接配接的資源。

6、此類的方法可以嵌套調用,為級聯查詢提供友善。以前iBatis的級聯查詢,我用此類全實作了。

此類也存在一些不足:

比如,無法去封裝預定義SQL,也許有辦法,但絕對不是輕而易舉就能實作的。

此類也無法對結果集自動封裝為JavaBean或者List集合,這是比較麻煩的,實際上要實作自動封裝,Apache的Commons DBUtils做的比較好。

本文轉自 leizhimin 51CTO部落格,原文連結:http://blog.51cto.com/lavasoft/233549,如需轉載請自行聯系原作者