日期:2014-05-16 浏览次数:20622 次
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语句