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 }

配置文件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>

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

时间: 2024-08-26 18:27:01

JDBC之——一个单线程JDBC基类和一些注意事项的相关文章

当this指针成为指向之类的基类指针时,也能形成多态

this指针: 1)对象中没有函数,只有成员变量 2)对象调用函数,通过this指针告诉函数是哪个对象自己谁. 1 #include<iostream> 2 using namespace std; 3 class Shape 4 { 5 public: 6 //void cal_display(Shape* this) 7 void cal_display(){ 8 display(); 9 this->display(); 10 } 11 private: 12 virtual vo

C++中虚基类

摘自<C++程序设计> 如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员. C++提供虚基类(virtual base class)的方法,使得在继承间接共同基类时只保留一份成员. 下面举例说明: 在如下的图中: Person类是Student和Teacher的基类,而Graduate类又继承自Student和Teacher类. 如果使用虚基类的话,Graduate将有两份age拷贝,两份gender拷贝,两份name

C++的虚基类知识点

当在多条继承路径上有一个公共的基类,在这些路径的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类. class x1:virtual public x{//... ...};class x2:virtual public x{//... ...};虚基类的初始化 虚基类(虚拟继承)的初始化与一般多继承的初始化在语法上是一样的,但构造函数的调用次序不同. 派生类的构造函数的调用次序有三个原则:(1)虚基类的构造函数在非虚基类之

条款7:为多态的基类声明虚析构函数。

任何的类只要带有一个virtual函数那么就集合可以确定其应该有一个virtual析构函数. 同样的如果一个函数不含有virtual函数,那么通常意味着其不是一个基类函数,而且为一个不是基类的类声明virtual的析构函数是十分糟糕的事情,不要这样做.具体原因在下面: 1.首先,想要实现出virtual函数,对象必须要携带某些信息,.信息通过vptr来实现,这个vptr指向一个由函数指针构成的数组,即vtbl.盲目的去使用虚函数就会使得浪费资源.(一般人的经验是,只有当函数需要使用一个虚函数的时

【Android先进】我们为什么要创建Activity基类Activity什么是一般的基类方法

今天,它可以被视为只是基本完成了其首个商业项目,在发展过程中,风格,然而随着工作经验的积累.最终開始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. 首先,在如今的项目中使用的主要是afinal框架,并且这个框架确实比較不错,省去了不少工作量.在编写Activity的过程中,基本都是直接继承自FinalActivity类,这样能够使用这个类给我们封装好的不少的方法,可是随着项目慢慢推进,这样的直接继承框架类的一些缺点也開始慢慢的显现出来.最基本的就是扩展性受到了一

C++虚基类详解

1.虚基类的作用从上面的介绍可知:如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免产生二义性,使其惟一地标识一个成员,如    c1.A::display( ).在一个类中保留间接共同基类的多份同名成员,这种现象是人们不希望出现的.C++提供虚基类(virtual base class )的方法,使得在继承间接共同基类时只保留一份成员.现在,将类A声明为

C++:虚基类

4.4.3 虚基类1.没什么要引入虚基类 如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个间接的共同基类数据成员的多分同名成员.在访问这些同名的成员时,必须在派生类对象后增加直接基类名,使其惟一地标识一个成员,以免产生二义性. //例 4.15 虚基类的引例 #include<iostream> using namespace std; class Base{ //声明类Base1和类Base2的共同的基类Base public: Base() { a

构建自己的PHP框架--抽象Controller的基类

上一篇博客中,我们将简单的路由解析和执行,从入口文件public/index.php中移入到框架中.入口文件顿时变得清爽无比-- 但是,去我们的controller里看一下,会看到如下的code: public function actionView() { $body = 'Test body information'; require '../views/site/view.php'; } 难道我们每写一个要去渲染页面的action,都要去找相应路径的view,然后把它require进来.肯

C++语言笔记系列之十七——虚基类

1.虚基类 考虑这样一种情况:当某个类的部分或者全部直接基类是另一个共同基类派生而来,这些直接基类从上一级基类继承而来的成员就一定拥有相同的名称,这样就会产生二义性问题. 解决办法:当派生类和直接基类产生了二义性问题-->加类的作用域. 当派生类和间接基类产生了二义性问题-->虚基类. 2.虚基类的说明: class 派生类名:virtual 访问权限 基类名 {派生类定义}; 注意:在定义派生类时将需要继承的基类进行虚化声明,虚基类的说明在派生类的定义中完成. 作用:将基类说明为虚基类之后,