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

Posted

技术标签:

【中文标题】PreparedStatement 中的这些值/参数是啥意思?【英文标题】:What do these values / parameters in PreparedStatement mean?PreparedStatement 中的这些值/参数是什么意思? 【发布时间】:2017-04-25 14:11:42 【问题描述】:

我正在学习如何通过DAO tutorial 使用 JDBC 创建数据层。 但是我在这一点上卡住了:PreparedStatement statement = prepareStatement(connection, SQL_UPDATE, false, values); 为什么要以这种方式使用 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);
    

【问题讨论】:

prepareStatement 是用户定义的方法吗?请发布该方法的代码。 @JitinKodian 我还认为它可能是一些用户定义的方法。但在BalusC tutorial : 中没有找到它 【参考方案1】:

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

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

同样,PreparedStatement 的参数以更具声明性的方式给出,而设置它们的代码隐藏在实用程序方法中。参数设置非常松散且容易出错(除其他问题外,没有类型检查),所显示的内容适合简洁的教程,但不是在实际项目中复制的最佳内容。

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

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

【讨论】:

以上是关于PreparedStatement 中的这些值/参数是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

IN子句效率中的preparedstatement设置值

PreparedStatement 选择执行失败

JDBC中的PreparedStatement

PreparedStatement 中的列索引无效

Java -- JDBC 学习--PreparedStatement

Java PreparedStatement 检索最后插入的 ID [重复]