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

JDBC模板类(version 1.2)
1.2版本中添加了一个新插入的方法:

 /**
  * 在Web开发中struts框架中,页数数据在被存入数据库时会被包装在一个formbean对象中
  * 在把这些数据存入数据库时,需要把formbean中值取出来,在插入数据库中这样很麻烦
  * 所以我设计了这个方法,只需要一个sql语句(sql语句字段名必须和数据库中的完全一致,字段顺序可以随便)
  * 和一个封装好数据对象。
  * 这个方法对页面数据提交在存入数据库,有很大方便。
  * 在这里插入主键时,主键值也应当包含那个封装对象中
  * 思想:主要是对sql语句进行分析,解析出要插入字段名称,在利用反射技术将值set到preparedStatement对象中。
  * @param sql 数据库插入 sql语句
  * @param obj 已经封装好数据对象
  * @return 新增成功记录数
  * @throws Exception
  */
 public int insert(String sql, Object obj) throws Exception {
  if(obj==null){
   return 0;
  }
  Connection conn=null;
  PreparedStatement ps=null;
  ResultSet rs=null;
  String [] fieldNames=resolveSQL(sql);
  try {
   conn=jdbcUtil.getConnection();
   ps=jdbcUtil.scrollReadOnlyResultSet(sql,conn);
   for(int i=0;i<fieldNames.length;i++){
    Object o=valueFromObject(fieldNames[i],obj);
    PreparedStatementSetValue(ps,o,i+1);
   }
   return ps.executeUpdate();
  }finally{
   jdbcUtil.free(rs,ps,conn);
  }
  
 }

?

=================================================================

package daoUtil.daoTemplate;

import java.lang.reflect.InvocationTargetException;
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 getRecordC