可复用的update和find方法

来源:互联网 发布:我的世界登入器源码 编辑:程序博客网 时间:2024/04/27 21:54

update方法:

public static void update(String sql,Object params[]) throws SQLException{
  Connection conn = null;
  PreparedStatement st = null;
  ResultSet rs = null;
  try{
   
   conn = getConnection();
   st = conn.prepareStatement(sql);
   for(int i=0;i<params.length;i++){
    st.setObject(i+1, params[i]);
    
   }
   st.executeUpdate();
  }finally{
   release(conn, st, rs);
  }
 }

 

find方法:

 //策略模式UserHandler
 public static Object query(String sql,Object params[],ResultSetHandler rsh) throws SQLException{
  Connection conn = null;
  PreparedStatement st = null;
  ResultSet rs = null;
  try{
   conn = getConnection();
   st = conn.prepareStatement(sql);
   for(int i=0;i<params.length;i++){
    st.setObject(i+1, params[i]);
   }
   rs = st.executeQuery();
   
   //这时候,程序拿到rs(结果集),框架的设计者 不知道该把rs封装到哪个对象 ,那就由用户去决定怎么去封装,框架的设计者暴露一个处理接口给用户,由用户去实现
   
   
   return rsh.handler(rs);
  }finally{
   release(conn, st, rs);
  }
 }
}

//代表的resultSet处理器
interface ResultSetHandler{
 public Object handler(ResultSet rs)  throws SQLException;
}

//框架设计者写的一个处理器,这个处理器用于把rs的数据封装到bean
class BeanHandler implements ResultSetHandler{
 private Class clazz;  //记住结果集的数据封装到哪一个对象中
 public BeanHandler(Class clazz){
  this.clazz = clazz;
 }
 
 public Object handler(ResultSet rs) throws SQLException {
  Object obj = null;
  try {
   obj = clazz.newInstance();
  
   ResultSetMetaData meta = rs.getMetaData();
   int columnNum = meta.getColumnCount();
   if(rs.next()){
    
    for(int i=1;i<=columnNum;i++){
     Object value = rs.getObject(i); //取出某一列的数据
     String columnName = meta.getColumnName(i); //当前列的列名
     //id  id
     //name name
     //money money
     
     Field f = clazz.getDeclaredField(columnName);  //根据列名,从对象查找相应的属性
     f.setAccessible(true);  //暴力反射以访问私有属性
     f.set(obj, value);  //把值赋到对象的属性上
    }
   }
  
  } catch (Exception e) {
   e.printStackTrace();
  }
  return obj;
 }
 
}

原创粉丝点击