我们经常写Dao类时,会有以下的代码。
 
try
{
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,state.getNid());
pstmt.setString(2,state.getStateName());
rtnVal = pstmt.executeUpdate();
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
catch(SQLException e)
{
e.printStackTrace();
}
finally
{
closeAll(conn,pstmt,null);
}
如何能把Try块内的代码和Try Catch Finally 分别封装,每次调用时向 异常处理块传入要操作的集合,就类似模板一样。
但又不知道如何使用模板模式编写。另外,这样的分离有没重用的实际意义。
   

解决方案 »

  1.   

    呵呵,实际上,只要你用到了Hibernate等其他框架的时候,就分发现写这个真的没实际意义的。
      

  2.   


    写个通用dao类就可以解决:
    package org.xixi.util;import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.List;import javax.servlet.jsp.jstl.sql.Result;
    import javax.servlet.jsp.jstl.sql.ResultSupport;public class SqlCommandBean {
    private Connection conn;
    private String sqlValue;
    private List values; /**
     * 设定连接
     */
    public void setConn(Connection conn) {
    this.conn = conn;
    } /**
     * 设定sql语句
     */
    public void setSqlValue(String sqlValue) {
    this.sqlValue = sqlValue;
    } /**
     * 设定sql语句的参数列表
     */
    public void setValues(List values) {
    this.values = values;
    } /**
     * 设定sql语句的每个参数
     */
    private void setValues(PreparedStatement pstmt, List values) {
    for (int i = 0; i < values.size(); i++) {
    Object v = values.get(i);
    try {
    pstmt.setObject(i + 1, v);
    } catch (SQLException e) {
    System.out.println(e.getMessage());
    }
    }
    } /**
     * 执行查询
     * @return 结果集
     */
    public Result getRs() {
    Result result = null;
    ResultSet rs = null;
    PreparedStatement pstmt = null;
    Statement stmt = null; try {
    if (values != null && values.size() > 0) {
    pstmt = conn.prepareStatement(sqlValue);
    setValues(pstmt, values);
    rs = pstmt.executeQuery(); } else {
    stmt = conn.createStatement();
    rs = stmt.executeQuery(sqlValue);
    }
    result = ResultSupport.toResult(rs);
    } catch (SQLException e) {
    System.out.println(e.getMessage());
    } finally {
    CM.close(rs, pstmt, stmt, conn);
    }
    return result;
    }

    /**
     * 执行增,删,改
     * @return 受影响的行数
     */
    public int executeSql(){
    int result = -1;
    ResultSet rs = null;
    PreparedStatement pstmt = null;
    Statement stmt = null; try {
    if(values!=null && values.size()>0){
    pstmt = conn.prepareStatement(sqlValue);
    setValues(pstmt,values);
    result = pstmt.executeUpdate();
    }else{
    stmt = conn.createStatement();
    result = stmt.executeUpdate(sqlValue);
    }

    } catch (Exception e) {
    System.out.println(e.getMessage());
    } finally {
    CM.close(rs, pstmt, stmt, conn);
    }
    return result;
    }
    }