1. CallableStatement 概述
CallableStatement 是 JDBC API 中的一个接口,它继承自PreparedStatement接口。与PreparedStatement的作用相似,它也是用于处理预编译的 SQL 语句。但是,它主要用于调用存储过程和函数。
CallableStatement 对象主要由调用prepareCall()方法生成,调用该方法时需要传入一个 SQL 语句,其中必须含有调用存储过程或函数的语法。例如:
{call some_procedure(?, ?, ?)}
该语句调用了一个名为some_procedure的存储过程,该过程有三个参数,因此语句中有三个问号占位符。
2. CallableStatement 的使用
2.1 注册存储过程参数
在 CallableStatement 中,可以通过registerOutParameter()方法注册存储过程或函数的输出参数。例如:
CallableStatement cs = conn.prepareCall("{call some_procedure(?, ?, ?)}");
cs.registerOutParameter(1, Types.INTEGER);
cs.registerOutParameter(2, Types.VARCHAR);
cs.registerOutParameter(3, Types.DATE);
这个例子中,通过三次调用registerOutParameter()方法,分别注册了三个输出参数,它们的类型分别是INTEGER、VARCHAR和DATE。
2.2 设置存储过程参数值
与 PreparedStatement 类似,CallableStatement 对象也提供了 setXXX() 方法用于设置存储过程或函数的输入参数值,其中 XXX 表示数据类型。例如,在下面的例子中,我们设置了存储过程第一个参数的值:
cs.setInt(1, 100);
2.3 执行存储过程
设置完参数后,就可以通过execute()方法执行存储过程了。如果存储过程调用成功,该方法返回true;否则返回false。例如:
boolean b = cs.execute();
2.4 获取存储过程返回值
当存储过程调用成功后,可以通过 getXXX() 方法获取它的输出参数值,其中 XXX 表示数据类型。例如:
int i = cs.getInt(1);
String s = cs.getString(2);
Date d = cs.getDate(3);
这个例子中,通过三次调用 getXXX() 方法,分别获取了存储过程的三个输出参数值。
2.5 示例代码
下面是一个 CallableStatement 的完整示例代码:
Connection conn = DriverManager.getConnection(url, username, password);
CallableStatement cs = conn.prepareCall("{call some_procedure(?, ?, ?)}");
cs.registerOutParameter(1, Types.INTEGER);
cs.registerOutParameter(2, Types.VARCHAR);
cs.registerOutParameter(3, Types.DATE);
cs.setInt(1, 100);
boolean b = cs.execute();
if (b) {
int i = cs.getInt(1);
String s = cs.getString(2);
Date d = cs.getDate(3);
}
cs.close();
conn.close();
3. 总结
CallableStatement 是 JDBC API 中的一个接口,它主要用于调用存储过程和函数。使用该接口需要注意以下几点:
必须使用 ? 占位符来表示存储过程或函数的输入和输出参数;
必须通过 registerOutParameter() 方法来注册存储过程或函数的输出参数;
必须通过 setXXX() 方法来设置存储过程或函数的输入参数值;
必须通过 execute() 方法来执行存储过程或函数;
必须通过 getXXX() 方法来获取存储过程或函数的输出参数值。
上述几点除了第一点其他点和 PreparedStatement 是一样的,如果您已经熟练使用 PreparedStatement,学习 CallableStatement 相对来说不难。