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 sql
122      * @param param
123      * @return
124      */
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 sql
151      * @return
152      */
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 sql
183      * @param param
184      * @return
185      */
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 sql
214      * @param param
215      * @return
216      */
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 sql
239      * @param param
240      * @return
241      */
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