使用Java编写控制JDBC连接、执行及关闭的工具类
简单的Java数据库连接和关闭工具类
写JDBC应用的人常常为关闭资源而头痛不已,这些代码枯燥无味,如何才能用简单的代码进行关闭呢,下面我写了一个方法,可以解除你的痛苦:
/** *关闭所有可关闭资源 * *@paramobjs可关闭的资源对象有Connection、Statement、ResultSet,别的类型资源自动忽略 */ publicstaticvoidcloseAll(Object...objs){ for(Objectobj:objs){ if(objinstanceofConnection)close((Connection)obj); if(objinstanceofStatement)close((Statement)obj); if(objinstanceofResultSet)close((ResultSet)obj); } }
这个方法,带了“...”参数,这个实际上是Java5中的可变参数方法。可以不论顺序,不论个数,调用时候直接关闭想要关闭的资源对象就ok了。例如:
catch(SQLExceptione){ e.printStackTrace(); }finally{ DBTools.closeAll(stmt,pstmt1,pstmt2,conn); }
下面给出这个类完整的写法:
packagecom.lavasoft.ibatistools.common; importcom.lavasoft.ibatistools.bean.Table; importcom.lavasoft.ibatistools.metadata.DataSourceMetaData; importcom.lavasoft.ibatistools.metadata.MySQLDataSourceMetaData; importjava.io.IOException; importjava.io.InputStream; importjava.sql.*; importjava.util.List; importjava.util.Properties; /** *简单的Java数据库连接和关闭工具类 * *@authorleizhimin11-12-20下午4:32 */ publicclassDBTools{ privatestaticStringdriverClassName,url,user,password; static{ init(); } privatestaticvoidinit(){ InputStreamin=DBTools.class.getResourceAsStream("/com/lavasoft/ibatistools/jdbc.properties"); Propertiespreps=newProperties(); 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(IOExceptione){ e.printStackTrace(); } } /** *创建一个JDBC连接 * *@return一个JDBC连接 */ publicstaticConnectionmakeConnection(){ Connectionconn=null; try{ Class.forName(driverClassName); conn=DriverManager.getConnection(url,user,password); }catch(ClassNotFoundExceptione){ e.printStackTrace(); }catch(SQLExceptione){ e.printStackTrace(); } returnconn; } publicstaticvoidclose(Connectionconn){ if(conn!=null) try{ conn.close(); }catch(SQLExceptione){ e.printStackTrace(); } } publicstaticvoidclose(ResultSetrs){ if(rs!=null) try{ rs.close(); }catch(SQLExceptione){ e.printStackTrace(); } } publicstaticvoidclose(Statementstmt){ if(stmt!=null) try{ stmt.close(); }catch(SQLExceptione){ e.printStackTrace(); } } /** *关闭所有可关闭资源 * *@paramobjs可关闭的资源对象有Connection、Statement、ResultSet,别的类型资源自动忽略 */ publicstaticvoidcloseAll(Object...objs){ for(Objectobj:objs){ if(objinstanceofConnection)close((Connection)obj); if(objinstanceofStatement)close((Statement)obj); if(objinstanceofResultSet)close((ResultSet)obj); } } publicstaticvoidmain(String[]args){ DataSourceMetaDatadbmd=MySQLDataSourceMetaData.instatnce(); List<Table>tableList=dbmd.getAllTableMetaData(DBTools.makeConnection()); for(Tabletable:tableList){ System.out.println(table); } } }
因为是在写工具,连接用到的次数很少,所以这里采用jdbc模式创建,而没有用到连接池。关闭方法用起来很爽,减少了代码量,也提高了程序的可靠性和质量。
一个简单的JDBC通用工具
支持多种数据库,统一方式产生连接,最优化、最简单方式释放资源。
欢迎拍砖!
importorg.apache.commons.logging.Log; importorg.apache.commons.logging.LogFactory; importjava.sql.*; importjava.util.List; importjava.util.Properties; /** *通用数据库操作工具,提供数据库连接获取、SQL执行、资源关闭等功能,支持的数据库为Oracle10g、MySQL5.x。</P> * *@authorleizhimin2012-03-0511:22 */ publicclassDBToolkit{ privatestaticLoglog=LogFactory.getLog(DBToolkit.class); static{ try{ Class.forName("oracle.jdbc.driver.OracleDriver"); Class.forName("com.mysql.jdbc.Driver"); }catch(ClassNotFoundExceptione){ log.error("加载数据库驱动发生错误!"); e.printStackTrace(); } } /** *创建一个数据库连接 * *@paramurl数据库连接URL串 *@paramproperties作为连接参数的任意字符串标记/值对的列表;通常至少应该包括"user"和"password"属性 *@return一个JDBC的数据库连接 *@throwsSQLException获取连接失败时候抛出 */ publicstaticConnectionmakeConnection(Stringurl,Propertiesproperties)throwsSQLException{ Connectionconn=null; try{ conn=DriverManager.getConnection(url,properties); }catch(SQLExceptione){ log.error("获取数据库连接发生异常",e); throwe; } returnconn; } /** *在一个数据库连接上执行一个静态SQL语句查询 * *@paramconn数据库连接 *@paramstaticSql静态SQL语句字符串 *@return返回查询结果集ResultSet对象 *@throwsSQLException执行异常时候抛出 */ publicstaticResultSetexecuteQuery(Connectionconn,StringstaticSql)throwsSQLException{ ResultSetrs=null; try{ //创建执行SQL的对象 Statementstmt=conn.createStatement(); //执行SQL,并获取返回结果 rs=stmt.executeQuery(staticSql); }catch(SQLExceptione){ log.error("执行SQL语句出错,请检查!\n"+staticSql); throwe; } returnrs; } /** *在一个数据库连接上执行一个静态SQL语句 * *@paramconn数据库连接 *@paramstaticSql静态SQL语句字符串 *@throwsSQLException执行异常时候抛出 */ publicstaticvoidexecuteSQL(Connectionconn,StringstaticSql)throwsSQLException{ Statementstmt=null; try{ //创建执行SQL的对象 stmt=conn.createStatement(); //执行SQL,并获取返回结果 stmt.execute(staticSql); }catch(SQLExceptione){ log.error("执行SQL语句出错,请检查!\n"+staticSql); throwe; }finally{ close(stmt); } } /** *在一个数据库连接上执行一批静态SQL语句 * *@paramconn数据库连接 *@paramsqlList静态SQL语句字符串集合 *@throwsSQLException执行异常时候抛出 */ publicstaticvoidexecuteBatchSQL(Connectionconn,List<String>sqlList)throwsSQLException{ try{ //创建执行SQL的对象 Statementstmt=conn.createStatement(); for(Stringsql:sqlList){ stmt.addBatch(sql); } //执行SQL,并获取返回结果 stmt.executeBatch(); }catch(SQLExceptione){ log.error("执行批量SQL语句出错,请检查!"); throwe; } } /** *获取Oracle数据一个指定的Sequence下一个值 * *@paramconn数据库连接 *@paramseq_nameSequence名称 *@returnSequence下一个值 */ publicstaticlongsequenceNextval(Connectionconn,Stringseq_name){ longval=-1L; Statementstmt=null; ResultSetrs=null; try{ //创建执行SQL的对象 stmt=conn.createStatement(); //执行SQL,并获取返回结果 rs=stmt.executeQuery("select"+seq_name+".nextvalfromdual"); if(rs.next())val=rs.getLong(1); }catch(SQLExceptione){ log.error("#ERROR#:获取Sequence值出错,请检查!\n"+seq_name); e.printStackTrace(); thrownewRuntimeException(e); }finally{ close(rs); close(stmt); } returnval; } /** *关闭所有可关闭的JDBC资源,不论先后顺序,总能以正确的顺序执行 * *@paramobjs可关闭的资源对象有Connection、Statement、ResultSet,别的类型资源自动忽略 */ publicstaticvoidcloseAll(Object...objs){ for(Objectobj:objs) if(objinstanceofResultSet)close((ResultSet)obj); for(Objectobj:objs) if(objinstanceofStatement)close((Statement)obj); for(Objectobj:objs) if(objinstanceofConnection)close((Connection)obj); } privatestaticvoidclose(Connectionconn){ if(conn!=null) try{ conn.close(); }catch(SQLExceptione){ log.error("关闭数据库连接发生异常!"); } } privatestaticvoidclose(ResultSetrs){ if(rs!=null) try{ rs.close(); }catch(SQLExceptione){ log.error("关闭结果集发生异常!"); } } privatestaticvoidclose(Statementstmt){ if(stmt!=null) try{ stmt.close(); }catch(SQLExceptione){ log.error("关闭SQL语句发生异常!"); } } /** *测试代码,没用 * *@paramargs *@throwsSQLException */ publicstaticvoidmain(String[]args)throwsSQLException{ Stringtns="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"+ ")"; Propertiesp_ora=newProperties(); p_ora.put("user","base"); p_ora.put("password","1qaz!QAZ"); p_ora.put("internal_logon","normal"); Connectionora_conn=makeConnection(tns,p_ora); ResultSetrs1=ora_conn.createStatement().executeQuery("selectcount(1)frombase.cfg_static_data"); rs1.next(); System.out.println(rs1.getInt(1)); rs1.close(); ora_conn.close(); Propertiesp_mysql=newProperties(); p_mysql.put("user","root"); p_mysql.put("password","leizm"); Stringurl="jdbc:mysql://localhost:3306/tdmc"; Connectionmysql_conn=makeConnection(url,p_mysql); ResultSetrs2=mysql_conn.createStatement().executeQuery("selectcount(1)fromcfg_code"); rs2.next(); System.out.println(rs2.getInt(1)); rs2.close(); mysql_conn.close(); } }