我们经常写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 分别封装,每次调用时向 异常处理块传入要操作的集合,就类似模板一样。
但又不知道如何使用模板模式编写。另外,这样的分离有没重用的实际意义。
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 分别封装,每次调用时向 异常处理块传入要操作的集合,就类似模板一样。
但又不知道如何使用模板模式编写。另外,这样的分离有没重用的实际意义。
写个通用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;
}
}