首页 > 代码库 > JDBC之——一个单线程JDBC基类和一些注意事项

JDBC之——一个单线程JDBC基类和一些注意事项

下面的一个DBase基类提供了一些jdbc的基本操作,配置文件的配置部分并不准确,只是在自己机器上的mysql中测试过。。

数据库的增删改方法中都在开始调用了getConnection方法,末尾调用了Close方法;
数据库的查询中没有调用close方法,因为一旦调用了close方法,就无法用RecodeSet操作查询结果了,
所以在调用了查询方法后,要调用close方法,防止出现 too many connections 错误。

此外,DBase中的所有对象都是static的,所以在使用时不要调用多余的DBase的getConnection方法,
因为,调用了getConnection方法后,初始化了静态的Connection变量conn,然后调用DBase的增删改查方法,又会初始化conn变量,

这个时候前一个初始化的conn虽然已经没有引用了,但是会等待GC回收。这个时段不会关闭建立的Connection,可能会导致too many connections 错误,

jdbc和数据库建立的连接要立刻断开的话必须要使用close方法。

 

DBase

  1 package db;  2   3   4   5 import java.io.File;  6 import java.sql.CallableStatement;  7 import java.sql.Connection;  8 import java.sql.PreparedStatement;  9 import java.sql.ResultSet; 10 import java.sql.SQLException; 11 import java.sql.Statement; 12  13 import org.dom4j.Document; 14 import org.dom4j.DocumentException; 15 import org.dom4j.Element; 16 import org.dom4j.io.SAXReader; 17  18 public class DBase { 19      20     private static String db_driver = "";//数据库驱动 21     private static String db_url = "";//连接字符串 22     private static String db_userName = "";//用户名 23     private static String db_userPass = "";//用户密码 24     private static String db_state = "";//状态 25     private static String db_dataBaseName = "";//数据库名 26      27     private static Connection conn = null; 28     private static PreparedStatement pst = null; 29     private static CallableStatement cs= null; 30     private static ResultSet res = null; 31     private static Statement st = null; 32     /** 33      * 加载必要的数据库连接信息 34      */ 35     private static void init(){ 36         try { 37             String url = Class.class.getClass().getResource("/").getPath();    //获取当前项目在本地的物理路径 38 //            System.out.println(url); 39             //利用dom4j获取xml文件的信息 40             SAXReader reader = new SAXReader(); 41             Document document = reader.read(new File(url + "db.xml")); 42             Element root = document.getRootElement();//xml文件的根目录 43             db_state = root.element("sqlserver").element("state").getText(); 44             db_driver = root.element("sqlserver").element("driver").getText(); 45             db_userName = root.element("sqlserver").element("userName").getText(); 46             db_userPass = root.element("sqlserver").element("userPass").getText(); 47             db_dataBaseName = root.element("sqlserver").element("dataBaseName").getText(); 48             db_url = "jdbc:sqlserver://" + root.element("sqlserver").element("baseURL").getText() + ":1433;databasename=" 49                     + db_dataBaseName; 50             if(db_state == "0" || "0".equals(db_state)){ 51                 db_state = root.element("mysql").element("state").getText(); 52                 db_driver = root.element("mysql").element("driver").getText(); 53                 db_userName = root.element("mysql").element("userName").getText(); 54                 db_userPass = root.element("mysql").element("userPass").getText(); 55                 db_dataBaseName = root.element("mysql").element("dataBaseName").getText(); 56                 db_url = "jdbc:mysql://" + root.element("mysql").element("baseURL").getText() + "/" 57                         + db_dataBaseName; 58 //                System.out.println(db_url); 59             } 60             if(db_state == "0" || "0".equals(db_state)){ 61                 db_state = root.element("oracle").element("state").getText(); 62                 db_driver = root.element("oracle").element("driver").getText(); 63                 db_userName = root.element("oracle").element("userName").getText(); 64                 db_userPass = root.element("oracle").element("userPass").getText(); 65                 db_dataBaseName = root.element("oracle").element("dataBaseName").getText(); 66                 db_url = "http://" + root.element("oracle").element("baseURL").getText() + ":1433;databasename=" 67                         + db_dataBaseName; 68             } 69         } catch (DocumentException e) { 70             e.printStackTrace(); 71         } 72          73     } 74      75     /** 76      * 创建数据库连接 77      * @return 78      */ 79     public static Connection getConn(){ 80         init(); 81         try { 82             Class.forName(db_driver); 83             conn = java.sql.DriverManager.getConnection(db_url, db_userName, db_userPass); 84             conn.setAutoCommit(false);        //关闭自动提交功能,改为人工提交事务 85             System.out.println("connection success~"); 86         } catch (ClassNotFoundException e) { 87             e.printStackTrace(); 88         } catch (SQLException e) { 89             e.printStackTrace(); 90         } 91         return conn; 92     } 93      94     /** 95      * 关闭数据库参数 96      */ 97     public static void close(){ 98         try { 99             if(res != null){100                 res.close();101             }102             if(pst != null){103                 pst.close();104             }105             if(st != null){106                 st.close();107             }108             if(cs != null){109                 cs.close();110             }111             if(conn != null){112                 conn.close();113             }114         } catch (SQLException e) {115             e.printStackTrace();116         }117     }118     119     /**120      * 执行sql语句的增删改121      * @param sql122      * @param param123      * @return124      */125     public static Integer executeSQL(String sql,String[] param) throws SQLException{126         Integer result = 0;127         conn = null;128         pst = null;129         try {130             conn = getConn();131             pst = conn.prepareStatement(sql);132             if(param != null){133                 for(int i = 0; i < param.length; i++){134                     pst.setString(i + 1, param[i]);135                 }136             }137             result = pst.executeUpdate();138             conn.commit();//提交事务139         } catch (SQLException e) {140             conn.rollback();//回滚事务141             e.printStackTrace();142         }finally{143             close();144         }145         return result;146     }147     148     /**149      * 批处理的增删改150      * @param sql151      * @return152      */153     public static Integer executeSQLBatch(String sql) throws SQLException{154         Integer result = 1;155         try {156             conn = null;157             st = null;158             conn = getConn();159             st = conn.createStatement();160             st.addBatch(sql);161             int[] resultArray = st.executeBatch();162             for(int i = 0; resultArray.length > 0 && i < resultArray.length;i++){163                 if(resultArray[i] <= 0){164                     result = 0;165                 }166             }167             if(result > 0){168                 conn.commit();169             }170         } catch (SQLException e) {171             conn.rollback();172             e.printStackTrace();173         }finally{174             close();175         }176         return result;177         178     }179     180     /**181      * 执行存储过程的增删改182      * @param sql183      * @param param184      * @return185      */186     public static Integer executeSQLProc(String sql,String[] param) throws SQLException{187         Integer result = 0;188         conn = null;189         cs = null;190         try {191             conn = getConn();192             cs = conn.prepareCall(sql);193             if(param != null){194                 for(int i = 0; i < param.length; i++){195                     cs.setString(i + 1, param[i]);196                 }197             }198             result = cs.executeUpdate();199             conn.commit();//提交事务200         } catch (SQLException e) {201             conn.rollback();//回滚事务202             e.printStackTrace();203         }finally{204             close();205         }206         return result;207     }208     209     210     211     /**212      * 普通sql查询213      * @param sql214      * @param param215      * @return216      */217     public static ResultSet execute(String sql,String[] param){218         try {219             conn = getConn();220             pst = conn.prepareStatement(sql);221             if(param != null){222                 for(int i = 0; i < param.length; i++){223                     pst.setString(i + 1, param[i]);224                 }225             }226             res = pst.executeQuery();227         } catch (SQLException e) {228             e.printStackTrace();229         } 230 //        finally{231 //            close();232 //        }233         return res;234     }235     236     /**237      * 执行存储过程的查询238      * @param sql239      * @param param240      * @return241      */242     public static ResultSet executeProc(String sql,String[] param){243         conn = null;244         cs = null;245         res = null;246         try {247             conn = getConn();248             cs = conn.prepareCall(sql);249             if(param != null){250                 for(int i = 0; i < param.length; i++){251                     cs.setString(i + 1, param[i]);252                 }253             }254             res = cs.executeQuery();255         } catch (SQLException e) {256             e.printStackTrace();257         }258         return res;259     }260 }
View Code

 

配置文件db.xml

<?xml version="1.0" encoding="UTF-8"?><database>    <sqlserver>        <driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver>数据库驱动        <userName>sa</userName>用户名        <userPass>sapassword</userPass>密码        <state>0</state>                    状态,是否开启        <dataBaseName>test</dataBaseName>数据库名        <baseURL>localhost</baseURL>服务器地址    </sqlserver>    <mysql>        <driver>com.mysql.jdbc.Driver</driver><!-- 数据库驱动 -->        <userName>root</userName><!-- 用户名 -->        <userPass>123</userPass><!-- 密码 -->        <state>1</state>                    <!-- 状态,是否开启 -->        <dataBaseName>baiduixia</dataBaseName><!-- 数据库名 -->        <baseURL>127.0.0.1:6606</baseURL><!-- 服务器地址 -->    </mysql>    <oracle>        <driver>oracle.jdbc.driver.OracleDriver</driver>数据库驱动        <userName>root</userName>用户名        <userPass>root</userPass>密码        <state>0</state>                    状态,是否开启        <dataBaseName>test</dataBaseName>数据库名        <baseURL>localhost</baseURL>服务器地址    </oracle></database>
View Code