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

 

你可能感兴趣的:(jdbc)