我正在学习如何使用JDBC DAO tutorial创建数据层。
但是我在这一点上陷入困境:PreparedStatement statement = prepareStatement(connection, SQL_UPDATE, false, values);
为什么prepareStatement以这种方式使用?
我将不胜感激任何解释和建议。
我查看了documentation并搜索了相关的例子,但没有找到任何关于这种结构的解释。当 prepareStatement 方法由 connection 对象调用时,我熟悉这样的表达式:
Connection connection = daoFactory.getConnection();
PreparedStatement statement = connection.prepareStatement(SQL);
但我不明白为什么PreparedStatement的实现方式如下例所示:
public void update(User user) throws DAOException {
if (user.getId() == null) {
throw new IllegalArgumentException("User is not created yet, the user ID is null.");
}
Object[] values = {
user.getEmail(),
user.getFirstname(),
user.getLastname(),
toSqlDate(user.getBirthdate()),
user.getId()
};
try (
Connection connection = daoFactory.getConnection();
PreparedStatement statement = prepareStatement(connection, SQL_UPDATE, false, values);
) {
int affectedRows = statement.executeUpdate();
if (affectedRows == 0) {
throw new DAOException("Updating user failed, no rows affected.");
}
} catch (SQLException e) {
throw new DAOException(e);
}
}
答案 0 :(得分:0)
这个方法在教程中给出,它是DAOUtil class:
的一部分public static PreparedStatement prepareStatement
(Connection connection, String sql, boolean returnGeneratedKeys, Object... values)
throws SQLException
{
PreparedStatement statement = connection.prepareStatement(sql,
returnGeneratedKeys ? Statement.RETURN_GENERATED_KEYS : Statement.NO_GENERATED_KEYS);
setValues(statement, values);
return statement;
}
DaoItil prepareStatement方法由DaoImpl在try-with-resources构造中使用。初始化的工作方式不允许多个语句,每个资源必须用一个表达式初始化。该方法将相关的初始化代码组合在一起,因此资源初始化代码可以调用它。
此外,PreparedStatement的参数以更具说明性的方式给出,而设置它们的代码隐藏在实用程序方法中。参数设置非常松散且容易出错(没有类型检查,以及其他问题),所显示的内容对于简明的教程是有益的,但不是在真实项目上复制的最佳方法。
如果参数设置代码抛出SQLException,则方法调用不会返回PreparedStatement,也不会关闭。在实践中,这通常并不可怕,因为它会发生 只有当参数与sql中的占位符匹配时才会出错(意味着问题更严重)。
重要的是连接和预备声明已关闭。否则,您可以尝试不同的编写方法并比较生成的代码。