2016-12-10 33 views
1

我正在学习如何使用JDBC DAO tutorial创建数据层。 但是我在这一点卡住了:PreparedStatement statement = prepareStatement(connection, SQL_UPDATE, false, values);为什么prepareStatement用这种方式?PreparedStatement中的这些值/参数是什么意思?

我将不胜感激任何解释和建议。

我已经通过documentation看上去和搜索相关的例子,但还没有发现这样一个结构的任何解释。我熟悉这样的表情,当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); 
    } 
} 
+1

'prepareStatement'是用户自定义的方法吗?请张贴该方法的代码。 –

+0

@JitinKodian我也认为它可能是一些用户定义的方法。但是在[BalusC教程:](http://balusc.omnifaces.org/2008/07/dao-tutorial-data-layer.html)中没有提及它。 –

回答

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

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

而且这样的参数给PreparedStatement以更声明性方式给出,而代码来设置它们是本实用方法中隐藏。参数设置非常松散且容易出错(不包括其他问题中的类型检查),所显示的内容对于简明教程很有用,但不适用于复制实际项目。

如果参数设定代码抛出SQLException的那么的PreparedStatement将无法获得通过方法调用返回的文件,也不会关闭。在实践中,这通常并不可怕,因为只有在sql中占位符参数出现错误时(意味着您遇到更严重的问题),才会发生 。

重要的是连接和预备声明关闭。否则,您可以尝试使用不同的方式编写此代码,并比较结果代码。