jdbc statement, preparedstatement 和 callablestatement
获得了数据库连接后,我们就可以与数据库进行交互了。jdbc 中的 statement, callablestatement 和 preparedstatement 三个对象,定义了一系列的方法和属性,可以用来向数据库发送 sql 命令,接收数据。
接口 | 使用说明 |
---|---|
statement | 运行静态 sql 语句时使用,statement 不能接收输入参数。 |
preparedstatement | 当计划多次使用某条 sql 语句时使用,并且 preparedstatement 可以接收输入参数。 |
callablestatement | 用来调用数据库的存储过程,callablestatement 可以接收输入参数。 |
1. statement 对象
1)创建 statement 对象
statement 对象由 connection 对象的 createstatement( ) 方法创建,用来执行静态 sql 语句,如下所示:
statement stmt = null; try { stmt = conn.createstatement( ); . . . } catch (sqlexception e) { . . . } finally { . . . }
一旦创建了一个 statement 对象,然后可以它的三个执行方法之一执行 sql 语句。
- boolean execute(string sql) :这个方法常用来执行 sql ddl 语句。
- int executeupdate(string sql) :返回 sql 语句执行时受影响的行数,常用来执行 insert,update 或 delete 语句。
- resultset executequery(string sql) : 返回 resultset 对象。常用来执行 select 语句,会得到一个结果集 resultset。
2)关闭 statement 对象
正如关闭一个 connection 对象来释放数据库资源,出于同样的原因,也应该关闭 statement 对象。
使用 close() 方法关闭 statement。
statement stmt = null; try { stmt = conn.createstatement( ); . . . } catch (sqlexception e) { . . . } finally { stmt.close(); }
2. preparedstatement 对象
preparedstatement 接口扩展了 statement 接口,给 statement 对象增加几个高级功能。
它对 sql 语句进行预编译,效率更高。另外,可以接收动态参数,避免 statement 中的 sql 注入问题。
1)创建 preparedstatement 对象
preparedstatement pstmt = null; try { string sql = "update employees set age = ? where id = ?"; pstmt = conn.preparestatement(sql); pstmt.setint(1, 22); . . . } catch (sqlexception e) { . . . } finally { . . . }
在 jdbc 中参数使用 ?代表,在执行 sql 语句之前,必须提供每一个参数的值。
setxxx() 方法将值绑定到参数,其中 xxx 表示希望绑定到输入参数值的 java 数据类型。如果忘了提供值,将收到一个sqlexception。
每个参数标记是由它的序号位置引用。第一标记表示位置 1,下一个位置为 2 等等。这种方法不同于 java 数组索引,以 0 开始。
2)关闭 preparedstatement 对象
正如关闭一个 connection 对象来释放数据库资源,出于同样的原因,也应该关闭 preparedstatement 对象。
使用 close() 方法关闭 preparedstatement。
preparedstatement pstmt = null; try { string sql = "update employees set age = ? where id = ?"; pstmt = conn.preparestatement(sql); . . . } catch (sqlexception e) { . . . } finally { pstmt.close(); }
3. callablestatement 对象
正如一个connection对象创建statement和preparedstatement对象,它也创造了callablestatement对象这将被用来执行调用数据库存储过程。
1)创建 callablestatement 对象
假设需要执行以下 oracle 存储过程:
create or replace procedure getempname (emp_id in number, emp_first out varchar) as begin select first into emp_first from employees where id = emp_id; end;
存储过程有三种类型的参数:in,out和inout。 preparedstatement对象只使用in参数。 callablestatement对象可以使用所有三个。
这里是每个的定义:
参数 | 描述 |
---|---|
in | 它的值是在创建sql语句时未知的参数。将值绑定到与 setxxx() 方法的参数。 |
out | 其值由它返回的sql语句提供的参数。从 out 参数的 getxxx() 方法检索值。 |
inout | 同时提供输入和输出值的参数。绑定变量使用 setxxx() 方法,使用 getxxx() 方法检索值。 |
下面的代码显示了使用 connection.preparecall() 方法获得存储过程 callablestatement 对象:
callablestatement cstmt = null; try { string sql = "{call getempname (?, ?)}"; cstmt = conn.preparecall (sql); . . . } catch (sqlexception e) { . . . } finally { . . . }
sql 表示存储过程,里面使用了参数占位符。
使用 callablestatement 对象是就像使用 preparedstatement 对象,执行该语句之前,必须将值绑定到所有的参数,否则将收到一个 sqlexception。
如果有 in 参数,只要按照 preparedstatement 对象相同的规则,使用 setxxx() 方法绑定的 java 数据类型。
当使用 out 和 inout 参数就必须采用额外的 callablestatement 及 registeroutparameter() 方法。registeroutparameter() 方法绑定数据类型到存储过的返回值。
2)关闭 callablestatement 对象
正如关闭其他 statement 对象,出于同样的原因,也应该关闭 callablestatement 对象。
正如关闭一个 connection 对象来释放数据库资源,出于同样的原因,也应该关闭 callablestatementv 对象。
使用 close() 方法关闭 callablestatement。
callablestatement cstmt = null; try { string sql = "{call getempname (?, ?)}"; cstmt = conn.preparecall (sql); . . . } catch (sqlexception e) { . . . } finally { cstmt.close(); }