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)里!!
请问高手,这样大量的重复性劳动能否有什么解决方法,不胜感激!!
//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)里!!
请问高手,这样大量的重复性劳动能否有什么解决方法,不胜感激!!
解决方案 »
- imagePanel 如何加载一张新的图片 ?
- 为什么JDK 5.0版本装完后,调试的时候,那些错误的信息变成中文了啊?
- 求教题目
- 哪位是用VJ++编程的,请进来指点一下
- 100分关于 取安装路径的问题
- 哪本书对 java Application讲述比较清楚,特点是关于Swing?
- 为什么会出现“Exception in thread "main" java.lang.NoClassDefFoundError: java\HelloDate/class”这样的错误?
- 那里有JDK1.4down???我要用里面的那个javax.crypto类...
- writeObject()写字符串成功,但向量就不行,为什么?
- java连接jdk的问题
- java Thread 单个按钮实现文本动画的暂停和继续
- SWT问题
写个简单的,你自己看着改一下。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;
}
以上基本就完成了,对于不同的实体类,只需要更改两个填充的方法即可。
对于你第一部分代码中的设置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()){}括号中的代码也是类似的,也是可以抽取出来的。
先将user对象放在一个数组aa里面
for(int i = 0;i<9;i++)
{
pstmt.setString(i, aa[i]);
}当然这个只是适合在所有数据类型相同的情况下
finally {
DBUtil.closeAll(conn, pstmt, rs);
}
2、我是想有没有像BeanUtils.copyProperties(dest, orig),这样的简便方法?妄想了我??呵呵