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

JDBC模板类实现(version1.1)
package daoUtil.daoTemplate;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import jdbcUtil.JdbcUtil;
import daoUtil.PrimaryKeyer;
import daoUtil.RowMapper;
/**
 * 在写jdbc程序是可以清楚的知道
 * 在程序中只有sql语句和其参数值是变化
 * 其余程序代码几乎类似(获得连接,关闭连接)
 * 在这里我对以前所写jdbc程序进行了一下改进
 * 将获得连接和关闭连接的程序代码交给一个模板类去做
 * 再写jdbc程序时,调用模板类中相应的方法,传入sql语句和其参数值
 * 这样大大简化jdbc程序,给我们带来方便
 * 程序新版本往后日子会不断更新,渴望javaeye里面高手多多给我指点
 * @author kevin.wangwei
 * Email:wanwei.234@163.com
 * 2010-1-30
 */
public class DAOTemplate{
	/**jdbc工具类*/
	private JdbcUtil jdbcUtil=JdbcUtil.getInstance();
	/**
	 * 数据库删除操作
	 * @param sql 删除操作sql语句
	 * @param args 删除操作sql语句参数值数组
	 * @return 删除记录条数
	 * @throws SQLException
	 */
	public  int delete(String sql, Object[] args) throws SQLException {
		if(args==null||args.length==0){
			return 0;
		}
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			conn=jdbcUtil.getConnection();
			ps=jdbcUtil.scrollReadOnlyResultSet(sql,conn);
			for(int i=0;i<args.length;i++){
				ps.setObject(i+1,args[i]);//在这里我们应该调用下面的PreparedStatementSetValue方法,
				                          //不过这样写亦可以,但它不可以处理null值
			}
			return ps.executeUpdate();
		}finally{
			jdbcUtil.free(rs,ps,conn);
		}
	}
	/**
	 * 数据库更新操作
	 * @param sql 更新操作sql语句
	 * @param args sql语句参数值数组
	 * @return 更新记录条数
	 * @throws SQLException
	 */
	public int update(String sql, Object[] args) throws SQLException {
		if(args==null||args.length==0){
			return 0;
		}
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			conn=jdbcUtil.getConnection();
			ps=jdbcUtil.scrollReadOnlyResultSet(sql,conn);
			for(int i=0;i<args.length;i++){
				ps.setObject(i+1,args[i]);
			}
			return ps.executeUpdate();
		}finally{
			jdbcUtil.free(rs,ps,conn);
		}
	}
	/**
	 * 数据库查询操作 采用反射来给包装sql语句参数赋值
	 * @param sql 查询操作sql语句
	 * @param args 删除操作sql语句数组数值
	 * @return 结果对象
	 * @throws SQLException
	 */
	public Object find(String sql, Object[] args,RowMapper rowMapper) throws SQLException {
		if(args==null||args.length==0){
			return 0;
		}
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			conn=jdbcUtil.getConnection();
			ps=jdbcUtil.scrollReadOnlyResultSet(sql,conn);
			for(int i=0;i<args.length;i++){
				try {
					PreparedStatementSetValue(ps,args[i],i+1);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			rs=ps.executeQuery();
			Object obj=null;
			while(rs.next()){
				obj=rowMapper.rowMapping(rs);
			}
			return obj;
		}finally{
			jdbcUtil.free(rs,ps,conn);
		}
	}

	/**
	 * 获得表中记录数
	 * @param sql sql语句
	 * @param args 参数数组
	 * @return 表中记录数
	 * @throws SQLException
	 */
	public int getRecordCount(String sql, Object[] args) throws SQLException {
		if(args==null||args.length==0){
			return 0;
		}
		int count=0;
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			conn=jdbcUtil.getConnection();
			ps=jdbcUtil.scrollReadOnlyResultSet(sql,conn);
			for(int i=0;i<args.length;i++){
				ps.setObject(i+1,args[i]);
			}
			if(rs.next()){
				count=rs.getInt(1);
			}
		}finally{
			jdbcUtil.free(rs,ps,conn);
		}
		return count;
	}
	/**
	 * 根据数据库表名,找到该表中所有记录数
	 * @param tableName 要查询的表
	 * @return 表中记录数
	 * @throws SQLException
	 */
	public int getRecordCount(String tableName) throws SQLException {
		if(tableName==null||tableName.equals("")){
			return 0;
		}
		int count=0;
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			conn=jdbcUtil.getConnection();
			String sql="select count(*) from "+tableName;
			ps=jdbcUtil.scrollReadOnlyResultSet(sql,conn);
			if(rs.next()){
				count=rs.getInt(1);
			}
		}finally{
			jdbcUtil.free(rs,ps,conn);
		}
		return count;
	}
	/**
	 * 数据库插入操作(这是采用接口回调技术,由调用程序来给主键赋值)
	 * @param sql 插入操作 sql语句