Java之JDBC语句对象
JDBC 提供三种类型的语句对象: Statement , PreparedStatement , CallableStatement
其中 PreparedStatement 是 Statement 的子类, CallableStatement 是 PreparedStatement 的子类。每一种语句对象用来运行特定类型的 SQL 语句
- Statement 对象用来运行简单类型的 SQL 语句,语句中无需指定参数
- PreparedStatement 对象用来运行包含(或不包含) IN 类型参数的预编译 SQL 语句
- CallableStatement 对象用来调用数据库存储过程
Statement
概述
Statement 对象用于将 SQL 语句发送到数据库服务器
创建 Statement 对象
建立连接后, Statement 对象用 Connection 对象的 createStatement 方法创建,以下代码创建 Statement 对象:
1 | Connection con = DriverManager.getConnection(url, SYSDBA, SYSDBA); |
使用 Statement 对象执行语句
tatement 接口提供了三种执行 SQL 语句的方法: executeQuery 、 executeUpdate 和 execute
- 方法 executeQuery 用于产生单个结果集的语句,例如 SELECT 语句
- 方法 executeUpdate 用于执行 INSERT 、 UPDATE 或 DELETE 语句以及 SQL DDL 语句,如 CREATE TABLE 和 DROP TABLE 。
- INSERT 、 UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。 executeUpdate 的返回值是一个整数,表示受影响的行数。对于 CREATE TABLE 或 DROP TABLE 等 DDL 语句, executeUpdate 的返回值总为零
- 方法 execute 用于执行返回多个结果集、多个更新元组数或二者组合的语句
执行语句的三种方法都将关闭所调用的 Statement 对象的当前打开结果集(如果存在)。这意味着在重新执行 Statement 对象之前,需要完成对当前 ResultSet 对象的处理。
关闭 Statement 对象
Statement 对象可由 Java 垃圾收集程序自动关闭。但作为一种好的编程风格,应在不需要 Statement 对象时显式地关闭它们。这将立即释放数据库服务器资源,有助于避免潜在的内存问题
PreparedStatement
概述
PreparedStatement 继承 Statement ,并与之在两方面有所不同:
- PreparedStatement 对象包含已编译的 SQL 语句,语句已经 “ 准备好 ”
- 包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。 IN 参数的值在 SQL 语句创建时未被指定。相反,该语句为每个 IN 参数保留一个问号( “ ? ” )作为占位符。每个问号所对应的值必须在该语句执行之前,通过适当的 setXXX 方法来提供。
- 由于PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,需要多次重复执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。
- 作为 Statement 的子类, PreparedStatement 继承了 Statement 的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代 IN 参数占位符的值。同时,三种方法 execute 、 executeQuery 和 executeUpdate 能执行设置好参数的语句对象
创建 PreparedStatement 对象
以下的代码段(其中 con 是 Connection 对象)创建一个 PreparedStatement 对象:
1 | PreparedStatement pstmt = con.prepareStatement( UPDATE 厂商登记 SET 厂商名 = ? WHERE 厂商编号 = ?); |
对象 pstmt 包含语句 UPDATE 厂商登记 SET 厂商名 = ? WHERE 厂商编号 = ? ,该语句带两个 IN 参数占位符,它已发送给数据库,并由服务器为其执行作好了准备。
CallableStatement
概述
CallableStatement 用来运行 SQL 存储过程。存储过程是数据库中已经存在的 SQL 语句,它通过名字调用
CallableStatement 是 PreparedStatement 的子类。 CallableStatement 中定义的方法用于处理 OUT 参数或 INOUT 参数的输出部分:注册 OUT 参数的 JDBC 类型(一般 SQL 类型)、从这些参数中检索结果,或者检查所返回的值是否为 JDBC NULL。
创建 CallableStatement 对象
CallableStatement 对象是用 Connection.prepareCall 创建的。
以下代码创建 CallableStatement 对象,其中含有对存储过程 p1 的调用, con 为连接对象:
1 | CallableStatement cstmt = con.prepareCall(call p1(?, ?)); |
其中 ? 占位符为 IN 、 OUT 还是 INOUT 参数,取决于存储过程 p1 。
示例
1 | improt java.sql.*; |