日期:2014-05-16  浏览次数:20357 次

jdbc工具类(1)

这是我个人在写JDBC代码用到的一个小工具,操作数据起来很方便,不再写很多代码,也不需要自己关闭连接、结果集了。

package jdbcUtil;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import dataSource.DataSource;

/**
 * 简单数据库连接工具类
 * 单例模式
 * @author kevin.wangwei
 * Email:wanwei.234@163.com
 * 2009-12-26
 */
public final class JdbcUtil {
	/**当前对象引用*/
	private static JdbcUtil instance=null;
	/**数据源对象*/
	private  DataSource dataSource=null;
	/**定义一个私有的构造函数,禁止创建该对象实例*/
	private  JdbcUtil(){
		dataSource=new DataSource();
	}
	/**
	 * 或得该工具类对象
	 * @return JdbcInstanceUtil对象
	 * @throws SQLException 
	 */
	public static JdbcUtil getInstance(){
		if(instance==null){
			synchronized(JdbcUtil.class){
			if(instance==null){//如果没有这个判断,当两个线程同时访问这个方法会出现创建两个对象
			instance=new JdbcUtil();
		    }
		}
	}
		return instance;
	}
	/**
	 * 获得数据库连接对象
	 * @return 数据库连接对象
	 * @throws SQLException
	 */
	public  Connection getConnection() throws SQLException{
		 return dataSource.getConnection();
	}
	/**
	 * TYPE_SCROLL_SENSITIVE jdbc规范:查出来结果要可以感应到数据的变化
	 * TYPE_SCROLL_INSENSITIVE 不必感应到数据库变化
	 * 获得可以滚动结果集---即结果集的指针可以上下移动来读取数据,以及定位来读取数据
	 * @param conn 数据库连接
	 * @return Statement对象
	 * @throws SQLException
	 */
	public Statement scrollResultSet(Connection conn) throws SQLException{
		if(conn==null){
			return null;
		}
		Statement st=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
		return st;
	}
	/**
	 * 获得PreparedStatement对象只读结果集
	 * @param sql  数据库 sql语句
	 * @return PreparedStatement 只读结果集
	 * @throws SQLException
	 */
	public PreparedStatement scrollReadOnlyResultSet(String sql,Connection conn)throws SQLException{
		if(conn==null){
			return null;
		}
		PreparedStatement st=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
		return st;
	}
	/**
	 * 获得可更新结果集---这种更新结果集一般不用, 用法:先定位到某一行,调用rs.updateString(1,900)再调用rs.updateRow();
	 * @param conn 数据库连接
	 * @return Statement对象
	 * @throws SQLException
	 */
	public  Statement updateResultSet(Connection conn) throws SQLException{
		if(conn==null){
			return null;
		}
		Statement st=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
		return st;
	}
	/**
	 * 获得PreparedStatement类中参数元信息,封装的sql语句信息(?数目,字段类型等)
	 * @param ps PreparedStatement
	 * @return ParameterMetaData
	 * @throws SQLException
	 */
	public int getPreparedStatementMetaDatan(PreparedStatement ps) throws SQLException{
		if(ps==null){
			return 0;
		}
		ParameterMetaData pmd=ps.getParameterMetaData();
		return pmd.getParameterCount();
	}
	/**
	 * 获得数据库一些基本信息 数据库名称、版本、是否支持事务
	 * @param conn Connection
	 * @throws SQLException 
	 */
	public  void getDataBaseMessage(Connection conn) throws SQLException{
		if(conn==null){
			System.out.println("当前连接不存在!");
		}
		DatabaseMetaData dbmd=conn.getMetaData();
		String whether=dbmd.supportsTransactions()?"":"不";
		System.out.println("你当前使用数据库为:"+dbmd.getDatabaseProductName());
		System.out.println("数据库版本为:"+dbmd.getDatabaseProductVersion());
		System.out.println("该数据库"+whether+"支持事务");
	}
	/**
	 * 释放资源 
	 * 保证程序在出现任何异常都要关闭连接对象
	 * @param rs 结果集
	 * @param st statement
	 * @param conn 连接
	 */
	public void free(ResultSet rs,Statement st,Connection conn){
			try {
				if(rs!=null){
					rs.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				try {
					if(st!=null){
						st.close();
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}finally{
					try {
						if(conn!=null){
							dataSource.closeConnection(conn);
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		
	}
}

?

1 楼 cuichao703 2011-03-10  
楼主,试过多表带参数查询时,会报错吗??
我的一调用getParameterMetaDa