public class EmployeeDaoImpl extends JdbcDaoSupportImpl implements EmployeeDao {
@Override
public int save(Employee employee) throws EmployeeException {
String sql = "INSERT INTO EMPLOYEE VALUES(?,?,?)";
Connection conToUse = null;
PreparedStatement ps = null;
int status = 0;
try {
conToUse = getConnection();
ps = conToUse.prepareStatement(sql);
ps.setInt(1, employee.getEmpNo());
ps.setString(2, employee.getEmpName());
ps.setLong(3, employee.getEmpSal());
status = ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new EmployeeException(
"%%% Exception occured in EmployeeDao save() %%% " + e);
} finally {
DbUtils.closeQuietly(ps);
}
return status;
}
}
在示例代码中,EmployeeDaoImpl类将记录插入数据库。如果有任何异常引发,它会向服务层抛出EmployeeException,这是一个应用程序异常。抛出用户定义的异常有什么需要?在这种情况下我们也可以抛出SQLexceptions,它是否正确?
答案 0 :(得分:1)
在此实例中无需抛出用户定义的异常。 SQLException应该足够了。
如果Connection对象抛出了您定义的异常,则User Defined Exception会更有意义。
只要您抓住异常并对其执行一些重要事项。
答案 1 :(得分:1)
您不应该抛出ClassNotFoundExceptions,因为DAO不应该负责创建数据库连接。我希望getConnection从某个地方检索一个现有的连接,也许是一个threadlocal,它放在请求的前面。如果它是创建一个连接,那么它不会关闭它,这将是不好的。此外,您应该使用连接池(再次导致将可能抛出ClassNotFoundException的代码移动到DAO之外的某个位置)。
对于大多数SQLExceptions,您无法对它们做任何事情,但让它们冒泡,取消当前的工作单元,然后捕获并将其记录在异常处理程序中,因此检查异常是一种烦恼。 Spring在这里做了正确的事情,它将SQLExceptions转换为更有意义但未经检查的DataAccessExceptions,其中不同的子类型用于不同类型的错误。如果您发现自己需要捕获违反RI约束时抛出的异常,那么您将捕获brew install graphicsmagick
,而不必担心数据库供应商使用的SQLState,因为Spring已经为您翻译了它。
使用此未经检查的DataAccessException,没有理由再拥有特定于应用程序的包装器异常。
答案 2 :(得分:0)
是的,这些异常可以按原样抛出。 如果你有一个Ui前端或某种类型的客户端,那么将它包装为用户异常并扔掉是有意义的。