以前程序里使用SQL访问数据库时,都是直接用“+”将字段值嵌到SQL中。如:String sql = " select s.name from student s where s.id=' " + sId + " ' ";其实大部份数据库读取都可以用PreparedStatement来实现。
通常每个SQL语句都要通过 语法分析 -> 生成逻辑查询计划 -> 逻辑优化 -> 物理优化 等步骤生成具体的执行计划,用PreparedStatement就可以生成一个执行计划,以后只是参数改变(相当于执行计划的执行环境改变),前面的四个步骤也会省略,从而提高了效率。
概述
该 PreparedStatement 接口继承 Statement,并与之在两方面有所不同:
PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句“准备好”。包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。相反的,该语句为每个 IN 参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX 方法来提供。
由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。
作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代 IN 参数占位符的值。同时,三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。这些方法的 Statement 形式(接受 SQL 语句参数的形式)不应该用于 PreparedStatement 对象。
1、创建 PreparedStatement 对象
以下的代码段(其中 con 是 Connection 对象)创建包含带两个 IN 参数占位符的 SQL 语句的 PreparedStatement 对象:
PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");
pstmt 对象包含语句 "UPDATE table4 SET m = ? WHERE x = ?",它已发送给DBMS,并为执行作好了准备。
2、传递 IN 参数
在执行 PreparedStatement 对象之前,必须设置每个 ? 参数的值。这可通过调用 setXXX 方法来完成,其中 XXX 是与该参数相应的类型。例如,如果参数具有Java 类型 long,则使用的方法就是 setLong。setXXX 方法的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数的值。例如,以下代码将第一个参数设为 123456789,第二个参数设为 100000000:
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");
当 SQL 语句将运行许多次时,您可以使用 PreparedStatement 对象。SQL 语句可以预编译。“已准备的” 语句是已预编译的 SQL 语句。与使用 Statement 对象多次运行同一条语句(在每次运行语句时都要对其进行编译)相比,此方法效率更高。另外,PreparedStatement 对象中包含的 SQL 语句可能有一个或多个 IN 参数。使用 Connection.prepareStatement() 来建立 PreparedStatement 对象。
您可以使用成批更新功能来将单个 PreparedStatement 对象与多组输入参数值相关联。然后,可将此部件发送至数据库,作为单一实体进行处理。因为处理一组更新操作通常比每次处理一个更新操作要快,所以成批更新可获得更好的性能。若要使用成批更新程序,需要 JDBC 2.0 和 JDK 1.2。
下列示例显示如何使用 PreparedStatement 接口。
// Connect to the AS/400.
Connection c = DriverManager.getConnection("jdbc:as400://mySystem");
// Create the PreparedStatement
// object. It precompiles the
// specified SQL statement. The
// question marks indicate where
// parameters must be set before the
// statement is run.
PreparedStatement ps = c.prepareStatement("INSERT INTO MYLIBRARY.MYTABLE (NAME, ID) VALUES (?, ?)");
// Set parameters and run the
// statement.
ps.setString(1, "JOSH");
ps.setInt(2, 789);
ps.executeUpdate();
// Set parameters and run the
// statement again.
ps.setString(1, "DAVE");
ps.setInt(2, 456);
ps.executeUpdate();
// Close PreparedStatement and the
// Connection.
ps.close();
c.close();
分享到:
相关推荐
jdbc中preparedStatement比Statement的好处
JDBC中PreparedStatement接口提供的execute、executeQuery和executeUpdate之间的区别及用法
Java面试题34.jdbc中preparedStatement比Statement的好处.mp4
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句
JDBC基础教程之PreparedStatement.doc )
尚硅谷著名教师佟刚老师基于面对对象编程思想,对preparedStatement类一系列操作的案例。
内容为JDBC增删改查 ,事物处理, 批处理,以及预编译示例代码
jdbc2.0版 PreparedStatement接口的用法
NULL 博文链接:https://singleant.iteye.com/blog/1298837
Java之JDBC连接数据库实现增删改查(2018 使用Dao层实现 完美封装解决硬编码问题 使用预编译对象PreparedStatement) 配置文件 db.properties(保存数据库账号和密码等) 工具类 JDBCUtil.java(抽取公共部分,解决硬...
JDBC JDBC(Java Database Connectivity)可以为多种关系型数据库提供统一的访问操作接口。 JDBC API:提供各种访问操作接口。 Driver:数据库的驱动程序一般由第三方提供: Oracle ojdbc-x.jar MySQL mysql-connector-...
主要介绍了详解Java的JDBC中Statement与PreparedStatement对象,PreparedStatement一般来说比使用Statement效率更高,需要的朋友可以参考下
1、JDBC(Java Database Connection):java连接数据库统一接口API,底层主要通过直接的JDBC驱动和 JDBC-ODBC桥驱动实现与数据库的连接。 1>.JDBC驱动程序类型: <1>.JDBC-ODBC桥加ODBC驱动程序:需要ODBC驱动,适合...
1.使用JDBC完成用户注册功能 1.1.准备一个用户表 1.2.使用JDBC完成注册功能 1.3.使用JDBC完成用户登录 2.SQL注入问题 3.PreparedStatement类 3.1.PreparedStatement和... 8.PreparedStatement实现删除
练习3:使用PreparedStatement插入宠物信息.zip
第9章 JDBC编程;回顾;本章内容;9.1 JDBC基础;9.1.1 JDBC简介;9.1.1 JDBC简介;9.1.2 JDBC常用API简介;9.1.3 JDBC编程步骤;9.1.3 JDBC编程步骤;9.1.3 JDBC编程步骤;9.1.3 JDBC编程步骤; 9.1.3 JDBC编程步骤 ; 9.1.3 ...
java.sql.PreparedStatement 继承Statement接口,表示预编译的SQL语句的对象,SQL语句被预编译并且存储在PreparedStatement对象中。然后可以使用此对象高效地多次执行该语句。 java.sql.CallableStatement 用来...
高性能jdbc分页处理,使用PreparedStatement方式
4.1.1 PreparedStatement对象的创建 4.1.2 传递IN参数 4.1.3 传递对象参数 4.1.4 传递大型数据参数 4.2 调用存储过程对象 4.2.1 CallableStatement对象的创建 4.2.2 IN、OUT及INOUT参数的使用 4.2.3 执行...
Java-JDBC【之】JDBC概述、获取连接、SQL注入问题与解决、查询解析 1.JDBC概述 2.操作流程 1.初始化项目,导入`驱动jar包` 2.加载驱动类 3.创建数据库连接对象`Connection` 4.创建`Statement` (此处存在SQL注入问题)...