2015-07-04 17 views
1
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(应用程序异常)抛出到服务层。抛出用户定义的异常需要什么?在这种情况下,我们也可以抛出SQLException,是否正确?而不是重新抛出用户定义的异常,我们可以重新抛出Dao中的SQLException和ClassNotFound异常吗?

回答

1

在这种情况下,不需要抛出用户定义的异常。 SQLException应该足够了。

如果Connection对象抛出定义的异常,用户定义的异常将更有意义。

只要你发现异常并对它做些什么,那就是最重要的。

0

是这些类型的异常可以按原样抛出。 如果你有一个UI前端或某种类型的客户端,那么把它作为用户异常包装并抛出是有意义的。

1

您不应该抛出ClassNotFoundExceptions,因为DAO不应该负责创建数据库连接。我希望getConnection从某个地方(可能是threadlocal)检索现有连接,并将它放在请求中的较早位置。如果它创建一个连接,那么它不会关闭它,这将是不好的。此外,您应该使用连接池(再次导致移动可能会将DAO外部的某个ClassNotFoundException引发的代码)。

对于大多数SQLExceptions,你不能对它们做任何事情,但让它们冒泡,取消当前的工作单元,然后捕获并记录在异常处理程序中,因此检查异常是一件烦恼。 Spring在这里做了正确的事情,它将SQLExceptions转换为更有意义但未经检查的DataAccessExceptions,其中不同类型的子类型用于不同类型的错误。如果您发现自己需要捕获违反RI约束时抛出的异常,则会捕获DataIntegrityViolationException,而无需担心数据库供应商使用的SQLState,因为Spring已经为您翻译了它。

有了这个未经检查的DataAccessException,没有理由再有一个特定于应用程序的包装器异常。