用于JDBC操作数据库的公共类

  1 /* 
  2  * @(#)CommonSql.java  2011-9-5 
  3  *  
  4  * Copyright 2011 Bianjing,All rights reserved. 
  5  */  
  6 
  7 import java.sql.Connection;
  8 import java.sql.DatabaseMetaData;
  9 import java.sql.DriverManager;
 10 import java.sql.PreparedStatement;
 11 import java.sql.ResultSet;
 12 import java.sql.SQLException;
 13 import java.sql.Statement;
 14 import java.util.List;
 15 
 16 import javax.naming.Context;
 17 import javax.naming.InitialContext;
 18 import javax.sql.DataSource;
 19 
 20 /**
 21  * 用于JDBC操作数据库的共通类
 22  * 
 23  * @author Bianjing
 24  * @version 1.0.0 2011-9-5
 25  */
 26 public class CommonSql {
 27     /** 数据源 */
 28     private DataSource dataSource;
 29 
 30     /** 数据库连接对象 */
 31     private Connection connection;
 32 
 33     /** 数据库操作对象 */
 34     private PreparedStatement ps;
 35 
 36     /** 数据库操作对象 */
 37     private Statement statement;
 38 
 39     /** 返回的数据结果集对象 */
 40     private ResultSet rs;
 41 
 42     /** 是否自动提交事务,默认为true,如果该值为false则需要手动提交事务 */
 43     private boolean autoCommit = true;
 44 
 45     /** 数据库连接是否已经打开 */
 46     private boolean openConnection;
 47 
 48     /** JNDI名称 */
 49     private String jndiName;
 50 
 51     /** 数据库驱动 */
 52     private String driver;
 53 
 54     /** 数据库访问地址 */
 55     private String url;
 56 
 57     /** 用户名 */
 58     private String user;
 59 
 60     /** 密码 */
 61     private String pwd;
 62 
 63     public CommonSql() {
 64         
 65     }
 66 
 67     public CommonSql(DataSource dataSource) {
 68         this.dataSource = dataSource;
 69     }
 70 
 71     public CommonSql(String jndiName) {
 72         this.jndiName = jndiName;
 73     }
 74 
 75     public CommonSql(String driver, String url, String user, String pwd) {
 76         this.driver = driver;
 77         this.url = url;
 78         this.user = user;
 79         this.pwd = pwd;
 80     }
 81 
 82     /**
 83      * 打开数据库连接并创建数据库连接对象<br/>
 84      * 支持通过ICO注入数据源、数据库驱动、数据库驱动、JNDI名称、数据库访问地址和用户名、密码
 85      * 
 86      * @return boolean true:连接成功,false:连接失败
 87      */
 88     public boolean openConnection() {
 89         /**
 90          * 通过数据源来获取数据库连接对象
 91          */
 92         if (dataSource != null) {
 93             try {
 94                 connection = dataSource.getConnection();
 95                 // 数据库连接已经打开
 96                 openConnection = true;
 97             } catch (SQLException e) {
 98                 closeAll();
 99                 // 所有的"System.out.println"都可以替换为"logger.error"
100                 System.out.println("从数据源获取数据库连接失败!");
101                 throw new RuntimeException(e);
102             }
103 
104             return openConnection;
105         }
106         /**
107          * 通过JNDI来获取数据库连接对象
108          */
109         if (jndiName != null) {
110             try {
111                 Context initContext = new InitialContext();
112                 dataSource = (DataSource) initContext.lookup(jndiName);
113                 connection = dataSource.getConnection();
114                 // 数据库连接已经打开
115                 openConnection = true;
116             } catch (Exception e) {
117                 closeAll();
118                 System.out.println("从JNDI获取数据库连接失败!");
119                 throw new RuntimeException(e);
120             }
121 
122             return openConnection;
123         }
124         /**
125          * 通过数据库驱动、数据库访问地址、用户名、密码来获取数据库连接对象
126          */
127         try {
128             Class.forName(driver);
129             connection = DriverManager.getConnection(url, user, pwd);
130             // 数据库连接已经打开
131             openConnection = true;
132         } catch (Exception e) {
133             closeAll();
134             System.out.println("数据库连接失败!");
135             throw new RuntimeException(e);
136         }
137 
138         return openConnection;
139     }
140 
141     /**
142      * 执行数据库的更新操作
143      * 
144      * @param sql
145      *            要执行的SQL语句
146      * @return boolean true:执行成功,false:执行失败
147      */
148     public boolean execUpdate(String sql, Object... args) {
149         boolean isPassed = false;
150         // 判断连接数据库是否成功
151         if (openConnection) {
152             try {
153                 ps = connection.prepareStatement(sql);
154                 // 设置参数
155                 if (args != null && args.length > 0) {
156                     for (int i = 0; i < args.length; i++) {
157                         ps.setObject(i + 1, args[i]);
158                     }
159                 }
160                 ps.executeUpdate();
161 
162                 isPassed = true;
163             } catch (SQLException e) {
164                 try {
165                     if (autoCommit) {
166                         connection.rollback();
167                     }
168                 } catch (SQLException e1) {
169                     throw new RuntimeException(e1);
170                 }
171                 System.out.println("SQL:" + sql);
172                 throw new RuntimeException(e);
173             } finally {
174                 if (autoCommit) {
175                     closeAll();
176                 }
177             }
178         } else {
179             System.out.println("数据库连接对象没有打开!");
180         }
181 
182         return isPassed;
183     }
184     
185     /**
186      * 执行数据库的更新操作
187      * 
188      * @param sql
189      *            要执行的SQL语句
190      * @return boolean true:执行成功,false:执行失败
191      */
192     public boolean execUpdate(String sql, List<?> args) {
193         return execUpdate(sql, args.toArray());
194     }
195 
196     /**
197      * 执行批量更新数据库操作
198      * 
199      * @param sql
200      *            要执行的SQL语句的字符串数组
201      * @return boolean true:执行成功,false:执行失败
202      */
203     public boolean execUpdate(Object[] sql) {
204         boolean flag = false;
205         // 判断连接数据库是否成功
206         if (openConnection) {
207             try {
208                 statement = connection.createStatement();
209                 for (int i = 0; i < sql.length; i++) {
210                     statement.addBatch((String) sql[i]);
211                 }
212                 statement.executeBatch();
213 
214                 flag = true;
215             } catch (SQLException e) {
216                 try {
217                     if (autoCommit) {
218                         connection.rollback();
219                     }
220                 } catch (SQLException e1) {
221                     throw new RuntimeException(e1);
222                 }
223                 for (int i = 0; i < sql.length; i++) {
224                     System.out.println("SQL " + (i + 1) + ":" + sql[i]);
225                 }
226                 throw new RuntimeException(e);
227             } finally {
228                 if (autoCommit) {
229                     closeAll();
230                 }
231             }
232         } else {
233             System.out.println("数据库连接对象没有打开!");
234         }
235 
236         return flag;
237     }
238 
239     /**
240      * 执行批量更新数据库操作
241      * 
242      * @param sql
243      *            要执行的SQL语句的集合
244      * @return boolean true:执行成功,false:执行失败
245      */
246     public boolean execUpdate(List<?> sql) {
247         return execUpdate(sql.toArray());
248     }
249 
250     /**
251      * 执行数据库查询操作
252      * 
253      * @param sql
254      *            要执行的SQL语句
255      * @param args
256      *            查询参数列表
257      * @return ResultSet 返回查询的结果集对象
258      */
259     public ResultSet execQuery(String sql, Object... args) {
260         rs = null;
261         // 判断连接数据库是否成功
262         if (openConnection) {
263             try {
264                 ps = connection.prepareStatement(sql);
265                 // 设置参数
266                 if (args != null && args.length > 0) {
267                     for (int i = 0; i < args.length; i++) {
268                         ps.setObject(i + 1, args[i]);
269                     }
270                 }
271                 
272                 rs = ps.executeQuery();
273             } catch (SQLException e) {
274                 if (autoCommit) {
275                     closeAll();
276                 }
277                 System.out.println("SQL:" + sql);
278                 throw new RuntimeException(e);
279             }
280         } else {
281             System.out.println("数据库连接对象没有打开!");
282         }
283 
284         return rs;
285     }
286 
287     /**
288      * 执行数据库查询操作
289      * 
290      * @param sql
291      *            要执行的SQL语句
292      * @param args
293      *            查询参数列表
294      * @return ResultSet 返回查询的结果集对象
295      */
296     public ResultSet execQuery(String sql, List<?> args) {
297         return execQuery(sql, args.toArray());
298     }
299 
300     /**
301      * 根据标准SQL查询数据库,返回一个int值
302      * 
303      * @param sql
304      *            要执行的SQL语句
305      * @param args
306      *            查询参数列表
307      * @return int值,如果出错则返回-1
308      */
309     public int findForInt(String sql, Object... args) {
310         ResultSet rs = execQuery(sql, args);
311         int count = -1;
312         try {
313             if (rs != null && rs.next()) {
314                 count = rs.getInt(1);
315             }
316         } catch (SQLException e) {
317             throw new RuntimeException(e);
318         } finally {
319             if (autoCommit) {
320                 closeAll();
321             }
322         }
323 
324         return count;
325     }
326     
327     /**
328      * 根据标准SQL查询数据库,返回一个int值
329      * 
330      * @param sql
331      *            要执行的SQL语句
332      * @param args
333      *            查询参数列表
334      * @return int值,如果出错则返回-1
335      */
336     public int findForInt(String sql, List<?> args) {
337         return findForInt(sql, args.toArray());
338     }
339 
340     /**
341      * 关闭所有数据库连接对象
342      */
343     public void closeAll() {
344         if (rs != null || ps != null || statement != null || connection != null) {
345             try {
346                 if (rs != null) {
347                     rs.close();
348                 }
349             } catch (SQLException e) {
350                 throw new RuntimeException(e);
351             } finally {
352                 rs = null;
353                 if (ps != null || statement != null || connection != null) {
354                     try {
355                         if (ps != null && !ps.isClosed()) {
356                             ps.close();
357                         }
358                     } catch (SQLException e) {
359                         throw new RuntimeException(e);
360                     } finally {
361                         ps = null;
362                         if (statement != null || connection != null) {
363                             try {
364                                 if (statement != null && !statement.isClosed()) {
365                                     statement.close();
366                                 }
367                             } catch (SQLException e) {
368                                 throw new RuntimeException(e);
369                             } finally {
370                                 statement = null;
371                                 try {
372                                     if (connection != null
373                                             && !connection.isClosed()) {
374                                         connection.close();
375                                     }
376                                 } catch (SQLException e) {
377                                     throw new RuntimeException(e);
378                                 } finally {
379                                     connection = null;
380                                 }
381                             }
382                         }
383                     }
384                 }
385             }
386         }
387     }
388 
389     /**
390      * 提交事务并关闭数据库连接
391      */
392     public void commit() {
393         try {
394             if (!autoCommit) {
395                 connection.commit();
396             }
397         } catch (SQLException e) {
398             throw new RuntimeException(e);
399         } finally {
400             autoCommit = true;
401             closeAll();
402         }
403     }
404 
405     /**
406      * 回滚事务并关闭数据库连接
407      */
408     public void rollback() {
409         try {
410             if (!autoCommit) {
411                 connection.rollback();
412             }
413         } catch (SQLException e) {
414             throw new RuntimeException(e);
415         } finally {
416             autoCommit = true;
417             closeAll();
418         }
419     }
420 
421     public DataSource getDataSource() {
422         return dataSource;
423     }
424 
425     public void setDataSource(DataSource dataSource) {
426         this.dataSource = dataSource;
427     }
428 
429     public String getDriver() {
430         return driver;
431     }
432 
433     public void setDriver(String driver) {
434         this.driver = driver;
435     }
436 
437     public String getUrl() {
438         return url;
439     }
440 
441     public void setUrl(String url) {
442         this.url = url;
443     }
444 
445     public boolean getAutoCommit() {
446         return autoCommit;
447     }
448 
449     public void setAutoCommit(boolean autoCommit) {
450         try {
451             connection.setAutoCommit(autoCommit);
452         } catch (SQLException e) {
453             closeAll();
454             throw new RuntimeException(e);
455         }
456         this.autoCommit = autoCommit;
457     }
458 
459     public boolean getOpenConnection() {
460         return openConnection;
461     }
462 
463     public String getJndiName() {
464         return jndiName;
465     }
466 
467     public void setJndiName(String jndiName) {
468         this.jndiName = jndiName;
469     }
470 
471     public String getUser() {
472         return user;
473     }
474 
475     public void setUser(String user) {
476         this.user = user;
477     }
478 
479     public String getPwd() {
480         return pwd;
481     }
482 
483     public void setPwd(String pwd) {
484         this.pwd = pwd;
485     }
486 
487     public Connection getConnection() {
488         return connection;
489     }
490 
491     /**
492      * 测试数据库连接是否成功
493      * 
494      * @param args
495      * @throws SQLException
496      */
497     public static void main(String[] args) throws SQLException {
498         String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
499         String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=demo";
500         String user = "sa";
501         String pwd = "sa";
502 
503         CommonSql commonSql = new CommonSql(driver, url, user, pwd);
504         if (commonSql.openConnection()) {
505             System.out.println("数据库连接成功!");
506             DatabaseMetaData dbMetaData = commonSql.getConnection()
507                     .getMetaData();
508             System.out
509                     .print("当前连接的数据库是:" + dbMetaData.getDatabaseProductName());
510             System.out.println(" " + dbMetaData.getDatabaseProductVersion());
511         } else {
512             System.out.println("数据库连接失败!");
513         }
514 
515         commonSql.closeAll();
516     }
517 }
View Code

 

posted @ 2014-12-01 10:55  myJoan  阅读(402)  评论(0编辑  收藏  举报