简单的Java数据库连接和关闭工具类

简介:
写JDBC应用的人常常为关闭资源而头痛不已,这些代码枯燥无味,如何才能用简单的代码进行关闭呢,下面我写了一个方法,可以解除你的痛苦:
 
         /** 
         * 关闭所有可关闭资源 
         * 
         * @param objs 可关闭的资源对象有Connection、Statement、ResultSet,别的类型资源自动忽略 
         */
 
         public  static  void closeAll(Object... objs) { 
                 for (Object obj : objs) { 
                         if (obj  instanceof Connection) close((Connection) obj); 
                         if (obj  instanceof Statement) close((Statement) obj); 
                         if (obj  instanceof ResultSet) close((ResultSet) obj); 
                } 
        }
 
这个方法,带了“...”参数,这个实际上是Java5中的可变参数方法。可以不论顺序,不论个数,调用时候直接关闭想要关闭的资源对象就ok了。例如:
 
catch (SQLException e) { 
                        e.printStackTrace(); 
                }  finally { 
                        DBTools.closeAll(stmt, pstmt1, pstmt2, conn); 
                }
 
下面给出这个类完整的写法:
package com.lavasoft.ibatistools.common; 

import com.lavasoft.ibatistools.bean.Table; 
import com.lavasoft.ibatistools.metadata.DataSourceMetaData; 
import com.lavasoft.ibatistools.metadata.MySQLDataSourceMetaData; 

import java.io.IOException; 
import java.io.InputStream; 
import java.sql.*; 
import java.util.List; 
import java.util.Properties; 

/** 
* 简单的Java数据库连接和关闭工具类 

* @author leizhimin 11-12-20 下午4:32 
*/
 
public  class DBTools { 
         private  static String driverClassName, url, user, password; 

         static { 
                init(); 
        } 

         private  static  void init() { 
                InputStream in = DBTools. class.getResourceAsStream( "/com/lavasoft/ibatistools/jdbc.properties"); 
                Properties preps =  new Properties(); 
                 try { 
                        preps.load(in); 
                        driverClassName = preps.getProperty( "jdbc.driver"); 
                        url = preps.getProperty( "jdbc.url"); 
                        user = preps.getProperty( "jdbc.username"); 
                        password = preps.getProperty( "jdbc.password"); 
                }  catch (IOException e) { 
                        e.printStackTrace(); 
                } 
        } 

         /** 
         * 创建一个JDBC连接 
         * 
         * @return 一个JDBC连接 
         */
 
         public  static Connection makeConnection() { 
                Connection conn =  null
                 try { 
                        Class.forName(driverClassName); 
                        conn = DriverManager.getConnection(url, user, password); 
                }  catch (ClassNotFoundException e) { 
                        e.printStackTrace(); 
                }  catch (SQLException e) { 
                        e.printStackTrace(); 
                } 
                 return conn; 
        } 

         public  static  void close(Connection conn) { 
                 if (conn !=  null
                         try { 
                                conn.close(); 
                        }  catch (SQLException e) { 
                                e.printStackTrace(); 
                        } 
        } 

         public  static  void close(ResultSet rs) { 
                 if (rs !=  null
                         try { 
                                rs.close(); 
                        }  catch (SQLException e) { 
                                e.printStackTrace(); 
                        } 
        } 

         public  static  void close(Statement stmt) { 
                 if (stmt !=  null
                         try { 
                                stmt.close(); 
                        }  catch (SQLException e) { 
                                e.printStackTrace(); 
                        } 
        } 

         /** 
         * 关闭所有可关闭资源 
         * 
         * @param objs 可关闭的资源对象有Connection、Statement、ResultSet,别的类型资源自动忽略 
         */
 
         public  static  void closeAll(Object... objs) { 
                 for (Object obj : objs) { 
                         if (obj  instanceof Connection) close((Connection) obj); 
                         if (obj  instanceof Statement) close((Statement) obj); 
                         if (obj  instanceof ResultSet) close((ResultSet) obj); 
                } 
        } 

         public  static  void main(String[] args) { 
                DataSourceMetaData dbmd = MySQLDataSourceMetaData.instatnce(); 
                List<Table> tableList = dbmd.getAllTableMetaData(DBTools.makeConnection()); 
                 for (Table table : tableList) { 
                        System.out.println(table); 
                } 
        } 
}
 
因为是在写工具,连接用到的次数很少,所以这里采用jdbc模式创建,而没有用到连接池。关闭方法用起来很爽,减少了代码量,也提高了程序的可靠性和质量。
 


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/746904,如需转载请自行联系原作者
相关文章
|
2天前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
9 1
|
2天前
|
SQL 安全 Java
Java面试题:什么是JDBC以及如何在Java中使用它进行数据库操作?
Java面试题:什么是JDBC以及如何在Java中使用它进行数据库操作?
5 0
|
2天前
|
druid Java 数据库连接
Java面试题:解释数据库连接池的概念及其作用,讨论常见的连接池实现。
Java面试题:解释数据库连接池的概念及其作用,讨论常见的连接池实现。
9 0
|
2天前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
13 0
|
2天前
|
SQL 监控 Java
Java面试题:简述数据库性能优化的常见手段,如索引优化、SQL语句优化等。
Java面试题:简述数据库性能优化的常见手段,如索引优化、SQL语句优化等。
8 0
|
2天前
|
设计模式 缓存 安全
Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
7 0
|
2天前
|
设计模式 存储 缓存
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
9 0
|
2天前
|
设计模式 并行计算 安全
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
9 0
|
2天前
|
设计模式 安全 NoSQL
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
10 0
|
2天前
|
设计模式 存储 缓存
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
9 0