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

标签 java database jdbc prepared-statement dao

我正在学习如何使用 JDBC 创建数据层 DAO tutorial 。 然而我在这一点上陷入了困境: PreparedStatement statements = prepareStatement(connection, SQL_UPDATE, false, value); 为什么要这样使用prepareStatement?

如果您有任何解释和建议,我将不胜感激。

我已经浏览过documentation并搜索了相关示例,但没有找到这种构造的任何解释。当 connection 对象调用 prepareStatement 方法时,我熟悉这样的表达式:

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);
    }
}

最佳答案

这个方法在教程中给出,它是 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;
}

DaoUtilprepareStatement 方法由 DaoImpl 在 try-with-resources 构造中使用。初始化的工作方式不允许使用多个语句,每个资源都必须使用一个表达式进行初始化。该方法将相关的初始化代码组合在一起,以便资源初始化代码可以调用它。

这样,PreparedStatement 的参数就以更具声明性的方式给出,而设置它们的代码则隐藏在实用程序方法中。参数设置非常宽松且容易出错(没有类型检查等问题),所显示的内容对于简洁的教程来说很有用,但不是在实际项目中复制的最佳内容。

如果参数设置代码抛出 SQLException,则方法调用不会返回PreparedStatement,也不会关闭。实际上这通常并不可怕,因为它会发生 仅当参数与 sql 中的占位符匹配时出现错误(意味着您遇到更严重的问题)。

重要的是连接和准备好的语句要关闭。否则,您可以尝试不同的编写方式并比较生成的代码。

关于java - PreparedStatement 中的这些值/参数是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41071587/

相关文章:

java - Cassandra 中的 IN 关系对查询不利吗?

Java,从Derby数据库获取数据并将每一行转换为Json对象

java - Eclipse错误: Invalid signature file digest for Manifest main attributes on several projects

java - javap 输出中缺少指令编号

java - 如何设置 swt 文件对话框的位置?

java - 主 “variable output is already defined in main”中的PrintStream错误

MySQL:每隔两行更新一次字符串

sql - 具有序列的 Multi-Tenancy 系统(在 Azure 上)

jdbc - OCI JDBC 驱动程序和 NLS 设置

mysql - 使用 Xampp 的 mysql for java jdbc 程序