让我说这个:
String sql = "DELETE FROM "+ TABLE_NAME +" WHERE id=?";
try {
int ra = jdbcTemplate.update(connection -> {
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setLong(1, id);
stmt.executeUpdate();
return stmt;
});
if (ra == 0)
throw new SQLException(SQL_ERROR);
} catch (SQLException e){
LOGGER.error(SQL_ERROR);
throw new DataAccessLayerException("Entity could not be deleted due to SQL Exception");
}
我正在使用键(id)从表中删除实体。现在,我希望能够在不引起INTERNAL_SERVER_ERROR
的情况下向客户端报告RuntimeException
。
但是,我无法复制SQLException
。例如,如果我在sql语句中删除一个字母,我只会得到一个语法错误,该错误被抛出为运行时错误,似乎我没有抓住它。
帮助我了解SQLException在这里的确切含义,以及如何在不引起RuntimeException的情况下将其再现并报告给客户端?
您的代码是错误的。您正在调用update(PreparedStatementCreator psc)
,顾名思义,您的代码应创建一个完全“已准备好”的语句对象,但不应“执行”该语句,因此请删除update(PreparedStatementCreator psc)
调用。
executeUpdate()
调用抛出一个executeUpdate()
,而不是update()
,因此,在DataAccessException
块中,SQLException
的唯一来源就是您的SQLException
语句,因此您也可以抛出该try
]直接例外。不过,我建议您抛出if
。
由于Spring专门将已检查的DataAccessLayerException
转换为未检查的EmptyResultDataAccessException
运行时异常,所以在使用Spring JDBC时,您将始终获得运行时异常,这是good],因为您现在无需添加检查代码中所有方法的异常。
未处理的异常由Spring MVC处理。默认情况下,Spring MVC将重定向到错误页面。如果您不想这样做,请参见问题SQLException
。