使用Java编写控制JDBC连接、执行及关闭的工具类

简单的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模式创建,而没有用到连接池。关闭方法用起来很爽,减少了代码量,也提高了程序的可靠性和质量。


一个简单的JDBC通用工具
 
支持多种数据库,统一方式产生连接,最优化、最简单方式释放资源。
 
欢迎拍砖!

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; 

import java.sql.*;
import java.util.List;
import java.util.Properties; 

/**
* 通用数据库操作工具,提供数据库连接获取、SQL执行、资源关闭等功能,支持的数据库为Oracle10g、MySQL5.x。</P>
*
* @author leizhimin 2012-03-05 11:22
*/
public class DBToolkit {
  private static Log log = LogFactory.getLog(DBToolkit.class); 

  static {
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
      Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
      log.error("加载数据库驱动发生错误!");
      e.printStackTrace();
    }
  } 

  /**
   * 创建一个数据库连接
   *
   * @param url    数据库连接URL串
   * @param properties 作为连接参数的任意字符串标记/值对的列表;通常至少应该包括 "user" 和 "password" 属性
   * @return 一个JDBC的数据库连接
   * @throws SQLException 获取连接失败时候抛出
   */
  public static Connection makeConnection(String url, Properties properties) throws SQLException {
    Connection conn = null;
    try {
      conn = DriverManager.getConnection(url, properties);
    } catch (SQLException e) {
      log.error("获取数据库连接发生异常", e);
      throw e;
    }
    return conn;
  } 

  /**
   * 在一个数据库连接上执行一个静态SQL语句查询
   *
   * @param conn   数据库连接
   * @param staticSql 静态SQL语句字符串
   * @return 返回查询结果集ResultSet对象
   * @throws SQLException 执行异常时候抛出
   */
  public static ResultSet executeQuery(Connection conn, String staticSql) throws SQLException {
    ResultSet rs = null;
    try {
      //创建执行SQL的对象
      Statement stmt = conn.createStatement();
      //执行SQL,并获取返回结果
      rs = stmt.executeQuery(staticSql);
    } catch (SQLException e) {
      log.error("执行SQL语句出错,请检查!\n" + staticSql);
      throw e;
    }
    return rs;
  } 

  /**
   * 在一个数据库连接上执行一个静态SQL语句
   *
   * @param conn   数据库连接
   * @param staticSql 静态SQL语句字符串
   * @throws SQLException 执行异常时候抛出
   */
  public static void executeSQL(Connection conn, String staticSql) throws SQLException {
    Statement stmt = null;
    try {
      //创建执行SQL的对象
      stmt = conn.createStatement();
      //执行SQL,并获取返回结果
      stmt.execute(staticSql);
    } catch (SQLException e) {
      log.error("执行SQL语句出错,请检查!\n" + staticSql);
      throw e;
    } finally {
      close(stmt);
    }
  } 

  /**
   * 在一个数据库连接上执行一批静态SQL语句
   *
   * @param conn  数据库连接
   * @param sqlList 静态SQL语句字符串集合
   * @throws SQLException 执行异常时候抛出
   */
  public static void executeBatchSQL(Connection conn, List<String> sqlList) throws SQLException {
    try {
      //创建执行SQL的对象
      Statement stmt = conn.createStatement();
      for (String sql : sqlList) {
        stmt.addBatch(sql);
      }
      //执行SQL,并获取返回结果
      stmt.executeBatch();
    } catch (SQLException e) {
      log.error("执行批量SQL语句出错,请检查!");
      throw e;
    }
  } 

  /**
   * 获取Oracle数据一个指定的Sequence下一个值
   *
   * @param conn   数据库连接
   * @param seq_name Sequence名称
   * @return Sequence下一个值
   */
  public static long sequenceNextval(Connection conn, String seq_name) {
    long val = -1L;
    Statement stmt = null;
    ResultSet rs = null;
    try {
      //创建执行SQL的对象
      stmt = conn.createStatement();
      //执行SQL,并获取返回结果
      rs = stmt.executeQuery("select " + seq_name + ".nextval from dual");
      if (rs.next()) val = rs.getLong(1);
    } catch (SQLException e) {
      log.error("#ERROR# :获取Sequence值出错,请检查!\n" + seq_name);
      e.printStackTrace();
      throw new RuntimeException(e);
    } finally {
      close(rs);
      close(stmt);
    }
    return val;
  } 

  /**
   * 关闭所有可关闭的JDBC资源,不论先后顺序,总能以正确的顺序执行
   *
   * @param objs 可关闭的资源对象有Connection、Statement、ResultSet,别的类型资源自动忽略
   */
  public static void closeAll(Object... objs) {
    for (Object obj : objs)
      if (obj instanceof ResultSet) close((ResultSet) obj);
    for (Object obj : objs)
      if (obj instanceof Statement) close((Statement) obj);
    for (Object obj : objs)
      if (obj instanceof Connection) close((Connection) obj);
  } 

  private static void close(Connection conn) {
    if (conn != null)
      try {
        conn.close();
      } catch (SQLException e) {
        log.error("关闭数据库连接发生异常!");
      }
  } 

  private static void close(ResultSet rs) {
    if (rs != null)
      try {
        rs.close();
      } catch (SQLException e) {
        log.error("关闭结果集发生异常!");
      }
  } 

  private static void close(Statement stmt) {
    if (stmt != null)
      try {
        stmt.close();
      } catch (SQLException e) {
        log.error("关闭SQL语句发生异常!");
      }
  } 

  /**
   * 测试代码,没用
   *
   * @param args
   * @throws SQLException
   */
  public static void main(String[] args) throws SQLException {
    String tns = "jdbc:oracle:thin:@\n" +
        "(description= \n" +
        "\t(ADDRESS_LIST =\n" +
        "\t\t(address=(protocol=tcp)(host=10.87.30.44)(port=1521))\n" +
        "\t\t(address=(protocol=tcp)(host=10.87.30.45)(port=1521))\n" +
        "\t\t(address=(protocol=tcp)(host=10.87.30.46)(port=1521))\n" +
        "\t\t(load_balance=yes)\n" +
        "\t)\n" +
        "\t(connect_data =\n" +
        "\t\t(service_name=KFCS)\n" +
        "\t\t(failover_mode =\n" +
        "\t\t\t(type=session)\n" +
        "\t\t\t(method=basic)\n" +
        "\t\t\t(retries=5)\n" +
        "\t\t\t(delay=15)\n" +
        "\t\t)\n" +
        "\t)\n" +
        ")";
    Properties p_ora = new Properties();
    p_ora.put("user", "base");
    p_ora.put("password", "1qaz!QAZ");
    p_ora.put("internal_logon", "normal"); 

    Connection ora_conn = makeConnection(tns, p_ora);
    ResultSet rs1 = ora_conn.createStatement().executeQuery("select count(1) from base.cfg_static_data");
    rs1.next();
    System.out.println(rs1.getInt(1));
    rs1.close();
    ora_conn.close(); 

    Properties p_mysql = new Properties();
    p_mysql.put("user", "root");
    p_mysql.put("password", "leizm");
    String url = "jdbc:mysql://localhost:3306/tdmc";
    Connection mysql_conn = makeConnection(url, p_mysql);
    ResultSet rs2 = mysql_conn.createStatement().executeQuery("select count(1) from cfg_code");
    rs2.next();
    System.out.println(rs2.getInt(1));
    rs2.close();
    mysql_conn.close();
  }
}
(0)

相关推荐

  • Java使用JDBC连接数据库的实现方法

    本文实例讲述了Java使用JDBC连接数据库的实现方法,是Java数据库程序设计里非常实用的重要技巧.分享给大家供大家参考.具体如下: JDBC(Java Data Base Connectivity)数据库连接,通常我们在编写web应用或java应用程序要连接数据库时就要使用JDBC.使用JDBC连接数据库一般步骤有: 1.加载驱动程序 Class.forName(driver); 2.创建连接对象 Connection con = DriverManager.getConnection(ur

  • 在Java的JDBC使用中设置事务回滚的保存点的方法

    新的JDBC3.0保存点的接口提供了额外的事务控制.他们的环境中,如Oracle的PL/ SQL中的大多数现代的DBMS支持保存点. 当设置一个保存点在事务中定义一个逻辑回滚点.如果发生错误,过去一个保存点,则可以使用rollback方法来撤消要么所有的改变或仅保存点之后所做的更改. Connection对象有两个新的方法,可帮助管理保存点: setSavepoint(String savepointName): 定义了一个新的保存点.它也返回一个Savepoint 对象. releaseSav

  • Java编程中使用JDBC API连接数据库和创建程序的方法

    JDBC连接数据库 涉及到建立一个JDBC连接的编程是相当简单的.下面是这些简单的四个步骤: 导入JDBC包: 添加import语句到Java程序导入所需的类在Java代码中. 注册JDBC驱动程序:这一步会导致JVM加载所需的驱动程序实现到内存中,因此它可以实现JDBC请求. 数据库URL制定:这是创建格式正确的地址指向到要连接的数据库. 创建连接对象:最后,代码调用DriverManager对象的getConnection()方法来建立实际的数据库连接. 导入JDBC包: import 语句

  • 在Java的Spring框架的程序中使用JDBC API操作数据库

    同时与数据库使用普通的旧JDBC的工作,它变得繁琐写不必要的代码来处理异常,打开和关闭数据库连接等,但Spring的JDBC框架需要的所有低层次细节从打开连接,准备和执行SQL语句,过程异常,处理事务,最后关闭连接. 所以,你所要做的只是定义连接参数,并指定要执行的SQL语句,并做必要的工作,在每次迭代时从数据库中获取数据. Spring JDBC提供了一些方法和相应不同的类与数据库进行交互.我要采取经典和最流行的做法,利用JdbcTemplateclass框架.这是管理的所有数据库的通信和异常

  • 基于Java回顾之JDBC的使用详解

    尽管在实际开发过程中,我们一般使用ORM框架来代替传统的JDBC,例如Hibernate或者iBatis,但JDBC是Java用来实现数据访问的基础,掌握它对于我们理解Java的数据操作流程很有帮助. JDBC的全称是Java Database Connectivity. JDBC对数据库进行操作的流程:•连接数据库•发送数据请求,即传统的CRUD指令•返回操作结果集JDBC中常用的对象包括:•ConnectionManager•Connection•Statement•CallableStat

  • Java的JDBC中Statement与CallableStatement对象实例

    JDBC Statement对象实例 以下是利用以下三种查询以及打开和关闭说明的例子: boolean execute(String SQL) : 返回一个布尔值true,如果ResultSet对象可以被检索,否则返回false.使用这个方法来执行SQL DDL语句,或当需要使用真正的动态SQL. int executeUpdate(String SQL) : 返回受影响的SQL语句执行的行数.使用此方法来执行,而希望得到一些受影响的行的SQL语句 - 例如,INSERT,UPDATE或DELE

  • java基于JDBC连接Oracle 11g Release2实例分析

    本文实例讲述了java基于JDBC连接Oracle 11g Release2的方法.分享给大家供大家参考.具体如下: Oracle 11g Release 2 的 JDBC 连接似乎有所不同 ,如果你收到下面的异常: Listener refused the connection with the following error:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor.

  • java开发中基于JDBC连接数据库实例总结

    本文实例讲述了java开发中基于JDBC连接数据库的方法.分享给大家供大家参考,具体如下: 创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String  className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }c

  • 详解Java的JDBC中Statement与PreparedStatement对象

    一旦获得一个连接,我们可以与数据库进行交互.在JDBC Statement, CallableStatement 和 PreparedStatement 接口定义的方法和属性,使可以发送SQL或PL/SQL命令和从数据库接收数据. 它们还定义方法,帮助Java和数据库使用SQL数据类型之间转换数据的差异. 下表提供了每个接口的用途概要,了解决定使用哪个接口 Statement 对象: 创建Statement对象 在可以使用Statement对象执行SQL语句,需要使用Connection对象的c

  • 详解Java的JDBC API的存储过程与SQL转义语法的使用

    正如一个Connection对象创建Statement和PreparedStatement对象,它也创造了CallableStatement对象这将被用来执行调用数据库存储过程. 创建CallableStatement对象: 假设,需要执行以下Oracle存储过程: CREATE OR REPLACE PROCEDURE getEmpName (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS BEGIN SELECT first INTO EMP_FIRS

随机推荐