JDBC基础教程之PreparedStatement
摘要
这个PreparedStatement接口继承了语句,并在两个方面与它不同:
PreparedStatement实例包含已编译的SQL语句。这是为了让语句“准备好”。PreparedStatement对象中包含的SQL语句可以有一个或多个in参数。创建SQL语句时,未指定IN参数的值。相反,该语句保留了一个问号(“?)用于每个IN参数。)作为占位符。在执行语句之前,每个问号的值必须由适当的setXXX方法提供。
因为PreparedStatement对象已经过预编译,所以它的执行速度比Statement对象快。因此,执行多次的SQL语句往往被创建为PreparedStatement对象,以提高效率。
PreparedStatement作为Statement的子类,继承了Statement的所有功能。此外,它添加了一整套方法来设置发送到数据库的值,以替换IN参数中的占位符。同时,execute、executeQuery和executeUpdate这三个方法已经更改,因此它们不再需要参数。这些方法的语句形式(接受SQL语句参数的形式)不应用于PreparedStatement对象。
1.创建一个PreparedStatement对象。
(其中con是连接对象)的以下代码段创建了一个PreparedStatement对象,该对象包含一条SQL语句,该语句带有两个in参数占位符:
prepared statement pstmt = con . prepare statement(" UPDATE table 4 SET m =?其中x =?”);
pstmt对象包含语句“UPDATE table4 SET m =?其中x =?”,已经发送到DBMS,准备执行。
2.传入参数
在执行PreparedStatement对象之前,必须设置每个?参数的值。这可以通过调用setXXX方法来完成,其中XXX是对应于该参数的类型。例如,如果参数具有Java类型long,则使用的方法是setLong。setXXX方法的第一个参数是要设置的参数的序号位置,第二个参数是设置给这个参数的值。例如,下面的代码将第一个参数设置为123456789,将第二个参数设置为10000000:
pstmt.setLong(1,123456789);
pstmt.setLong(2,100000000);
一旦设置了给定语句的参数值,就可以使用它多次执行该语句,直到调用clearParameters方法清除它。在默认连接模式下(启用了自动提交),语句将在完成后自动提交或恢复。
如果基本数据库和驱动程序在提交语句后保持这些语句打开,则同一个PreparedStatement可以执行多次。如果不是这样,那么尝试使用PreparedStatement对象而不是Statement对象来提高性能是没有意义的。
使用pstmt(前面创建的PreparedStatement对象),下面的代码演示了如何设置两个参数占位符的值并执行pstmt 10次。如上所述,要做到这一点,数据库不能关闭pstmt。在本例中,第一个参数设置为“hi”并保持不变。在for循环中,第二个参数每次都设置为不同的值:从0开始,到9结束。
pstmt.setString(1," Hi ");
for(int I = 0;i < 10i++) {
pstmt.setInt(2,I);
int rowCount = pstmt . execute update();
}
3.参数中数据类型的一致性
setXXX方法中的XXX是Java类型。它是隐式JDBC类型(通用SQL类型),因为驱动程序会将Java类型映射到相应的JDBC类型(遵循本JDBCGuide中8.6.2“映射Java和JDBC类型”表中指定的映射),并将此JDBC类型发送到数据库。例如,下面的代码片段将PreparedStatement对象pstmt的第二个参数设置为44,Java类型为short:
pstmt.setShort(2,44);
驱动程序将44作为JDBC SMALLINT发送到数据库,这是Java短类型的标准映射。
程序员有责任确保每个IN参数的Java类型被映射到与数据库所需的JDBC数据类型兼容的JDBC类型。考虑数据库需要JDBC·斯莫林的情况。如果使用setByte方法,驱动程序会将JDBC TINYINT发送到数据库。这是可行的,因为许多数据库可以从一种相关类型转换成另一种相关类型,通常TINYINT可以用在SMALLINT适用的任何地方。
位律师回复
0条评论