Java 处理数据库异常

Java 处理数据库异常,java,mysql,sql-server,spring,Java,Mysql,Sql Server,Spring,我正在开发一个SpringMVC应用程序。我有一个DAO、服务和控制器。在Dao中,我有一个查询数据库以返回Sql行集的方法。我正在检查sql行集是否为空,如果为空,则引发运行时异常。此外,根据应用程序的逻辑,对数据库的查询应至少返回一行。所以,基本上我假设若我得到一个空的sql行集,那个么就会出现一些问题,可能是数据库损坏或类似的问题 这是检查未知异常的正确方法吗。还是应该按原样将sql行集返回给服务?当服务使用此sql行集时,可能会导致空指针异常 问题是如果我在dao中抛出异常,我就不能在测

我正在开发一个SpringMVC应用程序。我有一个DAO、服务和控制器。在Dao中,我有一个查询数据库以返回Sql行集的方法。我正在检查sql行集是否为空,如果为空,则引发运行时异常。此外,根据应用程序的逻辑,对数据库的查询应至少返回一行。所以,基本上我假设若我得到一个空的sql行集,那个么就会出现一些问题,可能是数据库损坏或类似的问题

这是检查未知异常的正确方法吗。还是应该按原样将sql行集返回给服务?当服务使用此sql行集时,可能会导致空指针异常


问题是如果我在dao中抛出异常,我就不能在测试用例中涵盖这一部分。这意味着我必须将db置于不一致的状态,这样代码才能执行和测试异常处理部分。

DAO层不应该关注业务规则。它应该简单地抽象数据操作,这样服务层就不需要关心数据存储的方式和位置


在我看来,DAO应该只返回一个空的结果集。服务需要知道如何处理空结果集,因为服务层通常是存储业务逻辑的地方。

DAO层不应该关心业务规则。它应该简单地抽象数据操作,这样服务层就不需要关心数据存储的方式和位置


在我看来,DAO应该只返回一个空的结果集。由服务决定如何处理空结果集,因为服务层通常是存储业务逻辑的地方。

不,更一般地说,您不应该仅仅因为现在没有这种情况或需求而在应用程序中引入限制。如果数据库中没有任何行,则数据库可能是空的。。。或者,您可能正在对该模式进行测试,但该模式当前为空。你这样做违背了道的旨意

此外,不要担心数据库,这是毫无意义的。如果您不能接受您正在使用的工具功能正常,那么您将无法构建任何东西。如果要处理数据库异常,请使用控制器捕获这些异常并重定向到显示错误消息的视图:

@ControllerAdvice
public class ErrorHandler {
    @ExceptionHandler(DataAccessException.class)
    public String handleDatabaseException(DataAccessException ex) {
        return "error";
    }

    @ExceptionHandler(CannotCreateTransactionException.class)
    public String handleAccessException(CannotCreateTransactionException ex) {
        return "database_error";
    }
}

不,更一般地说,您永远不应该仅仅因为您现在没有这种情况或需求而在应用程序中引入限制。如果数据库中没有任何行,则数据库可能是空的。。。或者,您可能正在对该模式进行测试,但该模式当前为空。你这样做违背了道的旨意

此外,不要担心数据库,这是毫无意义的。如果您不能接受您正在使用的工具功能正常,那么您将无法构建任何东西。如果要处理数据库异常,请使用控制器捕获这些异常并重定向到显示错误消息的视图:

@ControllerAdvice
public class ErrorHandler {
    @ExceptionHandler(DataAccessException.class)
    public String handleDatabaseException(DataAccessException ex) {
        return "error";
    }

    @ExceptionHandler(CannotCreateTransactionException.class)
    public String handleAccessException(CannotCreateTransactionException ex) {
        return "database_error";
    }
}