PreparedStatement中的这些值/参数是什么意思?

时间:2016-12-10 02:32:36

标签: java database jdbc prepared-statement dao

我正在学习如何使用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);
    }
}

1 个答案:

答案 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中的占位符匹配时才会出错(意味着问题更严重)。

重要的是连接和预备声明已关闭。否则,您可以尝试不同的编写方法并比较生成的代码。