1、public boolean update(Connection conn , Userinfo user) throws DAOException {
//UpdateById = "update "+EILabConstants.USERINFO_TABLE_NAME+"set username=?,password=?,sex=?,phone=?,email=?,usertype=?,isactive=?,pwdpromptquestion=?,promptanswer=? where userid=?";
log.debug("updating user!");
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(UpdateById);
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
pstmt.setString(3, user.getSex());
pstmt.setString(4, user.getPhone());
pstmt.setString(5, user.getEmail());
pstmt.setString(6, user.getUsertype());
pstmt.setString(7, user.getIsactive());
pstmt.setString(8, user.getPwdpromptquestion());
pstmt.setString(9, user.getPromptanswer());
pstmt.setInt(10, user.getUserid());
pstmt.execute();

log.debug("update success!");
return true;
} catch (SQLException e) {
log.error("update failed!", e);
throw new DAOException("SQLException :",e);
}
} 如何处理try 块里的大量的(我指的是像pstmt.setString(1, user.getUsername()))这样的重复性工作!太繁琐了,如果有n个这样的方法,我会疯狂的,有好的解决办法吗?
2、同上面一样,请看下面的代码public Userinfo findUserinfoById(int id) throws DAOException {
log.debug("finding user by id!");
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
Userinfo user = new Userinfo(); conn = DBUtil.getConnection();
try {
pstmt = conn.prepareStatement(QueryById); rs = pstmt.executeQuery();
while (rs.next()) {
user.setUserid(rs.getInt("userid"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setSex(rs.getString("sex"));
user.setPhone(rs.getString("phone"));
user.setEmail(rs.getString("email"));
user.setUsertype(rs.getString("usertype"));
user.setIsactive(rs.getString("isactive"));
user.setRegisterdate(rs.getDate("registerdate"));
user.setPwdpromptquestion(rs.getString("pwdpromptquestion"));
user.setPromptanswer(rs.getString("promptanswer"));
log.debug("find success!");
return user;
}
} catch (SQLException e) {
log.error("SQLException", e);
throw new DAOException("SQLException:", e);
}
return null;
}
while()语句里面也有这样类似的大量重复从数据库中取出来,再赋值到对象(VO)里!!
请问高手,这样大量的重复性劳动能否有什么解决方法,不胜感激!!

解决方案 »

  1.   

    这个很简单啊,jstl库里已经做了对resultset集合的封装,你完全可以做一个通用的daobase类。
    写个简单的,你自己看着改一下。import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.sql.SQLException;
    import java.util.List;
    import javax.servlet.jsp.jstl.sql.Result;
    import javax.servlet.jsp.jstl.sql.ResultSupport;public class DAOBaseImpl {
    private Connection conn;
    private String sqlValue;
    private List values; public void setConn(Connection conn) {
    this.conn = conn;
    } public void setSqlValue(String sqlValue) {
    this.sqlValue = sqlValue;
    } public void setValues(List values) {
    this.values = values;
    } public void closeConnection() throws SQLException {
    conn.close();
    } public void dispose(ResultSet rs, Statement st, PreparedStatement pst)
    throws SQLException {
    if (rs != null)
    rs.close();
    if (st != null)
    st.close();
    if (pst != null)
    pst.close();
    } private void setValues(PreparedStatement pst, List values)
    throws SQLException {
    for (int i = 0, n = values.size(); i < n; i++) {
    pst.setObject(i, values.get(i));
    }
    } /**
     * 查询方法
     * 
     * @return Result结果集
     * @throws SQLException
     */
    public Result executeQuery() throws SQLException {
    Result result = null;
    ResultSet rs = null;
    PreparedStatement pst = null;
    Statement st = null;
    try { if (values != null && values.size() > 0) {
    pst = conn.prepareStatement(sqlValue);
    setValues(pst, values); rs = pst.executeQuery();
    } else {
    st = conn.createStatement();
    rs = st.executeQuery(sqlValue);
    }
    result = ResultSupport.toResult(rs);
    } catch (SQLException e) {
    throw e;
    } finally {
    dispose(rs, st, pst);
    }
    return result;
    } /**
     * 更新的方法
     * @return sql影响的行数
     * @throws SQLException
     */
    public int executeUpdate() throws SQLException {
    int rowCount = -1;
    PreparedStatement pst = null;
    Statement st = null; try {
    if (values != null && values.size() > 0) {
    pst = conn.prepareStatement(sqlValue);
    setValues(pst, values);
    rowCount = pst.executeUpdate();
    } else {
    st = conn.createStatement();
    rowCount = st.executeUpdate(sqlValue);
    }
    } catch (SQLException e) {
    throw e;
    } finally {
    dispose(null, st, pst);
    }
    return rowCount;
    }
    }public boolean update(Connection conn , Userinfo user) throws DAOException {
            //UpdateById = "update "+EILabConstants.USERINFO_TABLE_NAME+"set       username=?,password=?,sex=?,phone=?,email=?,usertype=?,isactive=?,pwdpromptquestion=?,promptanswer=? where userid=?";
            log.debug("updating user!");
            PreparedStatement pstmt = null;
            try {
                pstmt = conn.prepareStatement(UpdateById);
                pstmt.setString(1, user.getUsername());
                pstmt.setString(2, user.getPassword());
                pstmt.setString(3, user.getSex());
                pstmt.setString(4, user.getPhone());
                pstmt.setString(5, user.getEmail());
                pstmt.setString(6, user.getUsertype());
                pstmt.setString(7, user.getIsactive());
                pstmt.setString(8, user.getPwdpromptquestion());
                pstmt.setString(9, user.getPromptanswer());
                pstmt.setInt(10, user.getUserid());
                pstmt.execute();
                
                log.debug("update success!");
                return true;
            } catch (SQLException e) {
                log.error("update failed!", e);
                throw new DAOException("SQLException :",e);
            }
    }
    这样做了,还不能满足你的要求,针对result的特点,可以写2个独立的方法,对实体类进行封装数据的操作。
    public Userinfo fillBean(Map row) {
            Userinfo user = null;
    if (!row.isEmpty()) {
                    user.setUserid((Integer)row.get("userid"));
    user.setUsername((String)row.get("username"));
    user.setPassword((String)row.get("password"));
    user.setSex((String)row.get("sex"));
    user.setPhone((String)row.get("phone"));
    user.setEmail((String)row.get("email"));
    user.setUsertype((String)row.get("usertype"));
    user.setIsactive((String)row.get("isactive"));
    user.setRegisterdate((Date)row.get("registerdate"));
    user.setPwdpromptquestion((String)row.get("pwdpromptquestion"));
    user.setPromptanswer((String)row.get("promptanswer"));
    }
    return user;
    }public List fillValues(Userinfo user) {
            List values = new ArrayList();
            values.add(user.getXXX());
            //... 以下略,填充list;
    return values;
    }
    楼主2个方法可以改成:public Userinfo findUserinfoById(int id) throws DAOException {
            log.debug("finding user by id!");
            Connection conn = DBUtil.getConnection();
            DAOBaseImpl daoBase = new DAOBaseImpl();
            Userinfo user = null;
            try {
                String sqlQuery = ".........";
                daoBase.setConnection(conn);
                daoBase.setSqlValue(sqlQuery);
                Result result = daoBase.executeQuery();
                daoBase.closeConnection();
                if( result != null || result.getRowCount() > 0){
                    // getRows()方法返回的是一个Map数组,
                    // map存放数据库表中的一行数据,如果查询结果为多行
                    // 可以遍历该数组
                    user = fillBean(result.getRows()[0]);
                }            
                log.debug("find success!");
                return user;
            } catch (SQLException e) {
                log.error("SQLException", e);
                throw new DAOException("SQLException:", e);
            }
            return user;
    }public boolean update(Connection conn , Userinfo user) throws DAOException {
            //UpdateById = "update "+EILabConstants.USERINFO_TABLE_NAME+"set username=?,password=?,sex=?,phone=?,email=?,usertype=?,isactive=?,pwdpromptquestion=?,promptanswer=? where userid=?";
            log.debug("updating user!");
            DAOBaseImpl daoBase = new DAOBaseImpl();
            boolean flag = false;
            try {
                daoBase.setConnection(conn);
                daoBase.setSqlValue(UpdateById);
                daoBase.setValues(fillValues(user));
                int count = daoBase.executeUpdate();
                daoBase.closeConnection();
                if(count!=-1){
                   log.debug("update success!");
                   flag = true;
                }else{
                   log.debug("update failed!");
                }
            } catch (SQLException e) {
                log.error("update failed!", e);
                throw new DAOException("SQLException :",e);
            }
            return flag;
    }
    以上基本就完成了,对于不同的实体类,只需要更改两个填充的方法即可。
      

  2.   

    谢谢1楼的zfc827 !我好好研究研究....再次谢过!!
      

  3.   

    如果是采用eclipse开发的话,可以使用其代码重构功能进行优化。
    对于你第一部分代码中的设置SQL的参数可以分离出一个私有的方法。
    使用方法是选中需要重构的那部分代码,右键》refactor》Extract Mehtod
    然后稍加修改,调试……private void setUser(Userinfo user, PreparedStatement pstmt)
    throws SQLException {
    pstmt.setString(1, user.getUsername());
    pstmt.setString(2, user.getPassword());
    pstmt.setString(3, user.getSex());
    pstmt.setString(4, user.getPhone());
    pstmt.setString(5, user.getEmail());
    pstmt.setString(6, user.getUsertype());
    pstmt.setString(7, user.getIsactive());
    pstmt.setString(8, user.getPwdpromptquestion());
    pstmt.setString(9, user.getPromptanswer());
    pstmt.setInt(10, user.getUserid());
    }
    当然我这代码不一定正确,只是给你提供一种思路。
    对于像while(rs.next()){}括号中的代码也是类似的,也是可以抽取出来的。
      

  4.   

    可不可以用循环来实现呢
    先将user对象放在一个数组aa里面
    for(int i = 0;i<9;i++)
    {
       pstmt.setString(i, aa[i]);
    }当然这个只是适合在所有数据类型相同的情况下
      

  5.   

    为什么没看到 0 楼代码 2 中的 con 关闭啊?如果使用纯 JDBC 的话没有什么办法,因为 JDBC 并不知道哪个属性值对应数据表中的哪个字段。
      

  6.   

    这个是忘了写了,本来有的
    finally {
        DBUtil.closeAll(conn, pstmt, rs);
    }
    2、我是想有没有像BeanUtils.copyProperties(dest, orig),这样的简便方法?妄想了我??呵呵