JDBC PreparedStatement
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应用程序(例如集群中的应用程序服务器)重用。