JDBC PreparedStatement

时间:2020-01-09 10:36:47  来源:igfitidea点击:

Java JDBC PreparedStatement是一种特殊的Java JDBC Statement对象,具有一些有用的添加函数。请记住,我们需要一个"声明"才能执行查询或者更新。我们可以使用Java JDBC PreparedStatement代替Statement,并从PreparedStatement的函数中受益。

Java JDBC的PreparedStatement主要函数是:

  • 易于在SQL语句中插入参数。
  • 易于使用新的参数值重用" PreparedStatement"。
  • 可能会提高执行的语句的性能。
  • 使批量更新更容易。

我将在本文中向我们展示如何在SQL语句中插入参数,以及如何重用PreparedStatement。批处理更新将在单独的文本中进行说明。

这是一个简单的示例,可让我们大致了解它在代码中的外观:

String sql = "update people set firstname=? , lastname=? where id=?";

PreparedStatement preparedStatement =
        connection.prepareStatement(sql);

preparedStatement.setString(1, "Gary");
preparedStatement.setString(2, "Larson");
preparedStatement.setLong  (3, 123);

int rowsAffected = preparedStatement.executeUpdate();

创建一个PreparedStatement

我们必须先创建一个PreparedStatement,然后才能使用它。我们可以使用Connection.prepareStatement()来做到这一点,如下所示:

String sql = "select * from people where id=?";

PreparedStatement preparedStatement =
        connection.prepareStatement(sql);

现在," PreparedStatement"已准备好插入参数。

将参数插入PreparedStatement

在我们需要在SQL中插入参数的任何地方,都写一个问号(?)。例如:

String sql = "select * from people where id=?";

为上述SQL语句创建(准备好)" PreparedStatement"后,我们可以在问号的位置插入参数。这是使用许多setXXX()方法完成的。这是一个例子:

preparedStatement.setLong(1, 123);

第一个数字(1)是要为其插入值的参数的索引。第二个数字(123)是要插入到SQL语句中的值。

这是相同的示例,但有更多详细信息:

String sql = "select * from people where id=?";

PreparedStatement preparedStatement =
        connection.prepareStatement(sql);

preparedStatement.setLong(123);

一个SQL语句中可以有多个参数。只需插入多个问号即可。这是一个简单的示例:

String sql = "select * from people where firstname=? and lastname=?";

PreparedStatement preparedStatement =
        connection.prepareStatement(sql);

preparedStatement.setString(1, "John");
preparedStatement.setString(2, "Smith");

执行PreparedStatement

执行PreparedStatement看起来就像执行常规的Statement。要执行查询,请调用executeQuery()或者executeUpdate方法。这是一个executeQuery()的例子:

String sql = "select * from people where firstname=? and lastname=?";

PreparedStatement preparedStatement =
        connection.prepareStatement(sql);

preparedStatement.setString(1, "John");
preparedStatement.setString(2, "Smith");

ResultSet result = preparedStatement.executeQuery();

如我们所见,executeQuery()方法返回一个ResultSet。在查询数据库文本中描述了对" ResultSet"的迭代。

这是一个" executeUpdate()"示例:

String sql = "update people set firstname=? , lastname=? where id=?";

PreparedStatement preparedStatement =
        connection.prepareStatement(sql);

preparedStatement.setString(1, "Gary");
preparedStatement.setString(2, "Larson");
preparedStatement.setLong  (3, 123);

int rowsAffected = preparedStatement.executeUpdate();

更新数据库时使用" executeUpdate()"方法。它返回一个整数,该整数告诉数据库中有多少记录受到更新的影响。

重用PreparedStatement

一旦准备好" PreparedStatement",就可以在执行后重用它。我们可以通过为参数设置新值来重用" PreparedStatement",然后再次执行它。这是一个简单的示例:

String sql = "update people set firstname=? , lastname=? where id=?";

PreparedStatement preparedStatement =
        connection.prepareStatement(sql);

preparedStatement.setString(1, "Gary");
preparedStatement.setString(2, "Larson");
preparedStatement.setLong  (3, 123);

int rowsAffected = preparedStatement.executeUpdate();

preparedStatement.setString(1, "Stan");
preparedStatement.setString(2, "Lee");
preparedStatement.setLong  (3, 456);

int rowsAffected = preparedStatement.executeUpdate();

这也适用于使用executeQuery()方法执行查询,该方法返回ResultSet

PreparedStatement 性能

数据库解析SQL字符串并为其创建查询计划需要花费时间。查询计划是对数据库如何以最有效的方式执行查询的分析。

如果为每个查询或者对数据库的更新提交新的完整SQL语句,则数据库必须解析SQL,并为查询创建查询计划。通过重用现有的" PreparedStatement",我们可以将SQL解析和查询计划重用于后续查询。通过减少每次执行的解析和查询计划开销,这可以加快查询的执行速度。

PreparedStatement有两个潜在的重用级别。

  • JDBC驱动程序重用PreparedStatement。
  • 数据库重用PreparedStatement。

首先,JDBC驱动程序可以在内部缓存" PreparedStatement"对象,从而可以重用" PreparedStatement"对象。这样可以节省一些" PreparedStatement"创建时间。

其次,缓存的解析和查询计划可能会使用相同的数据库跨Java应用程序(例如集群中的应用程序服务器)重用。