JDBC:CallableStatement

时间:2020-01-09 10:36:46  来源:igfitidea点击:

" java.sql.CallableStatement"用于调用数据库中的存储过程。

存储过程类似于类中的函数或者方法,不同之处在于它存储在数据库中。通过在与数据库服务器相同的内存空间中作为存储过程执行,某些数据库繁重的操作可能会提高性能。

创建一个CallableStatement

我们可以通过在连接对象上调用prepareCall()方法来创建CallableStatement的实例。这是一个例子:

CallableStatement callableStatement =
    connection.prepareCall("{call calculateStatistics(?, ?)}");

如果存储过程返回一个"结果集",并且我们需要一个非默认的"结果集"(例如具有不同的可保留性,并发性等特征),则在创建" CallableStatement"时就已经需要指定这些特征。这是一个例子:

CallableStatement callableStatement =
    connection.prepareCall("{call calculateStatistics(?, ?)}",
        ResultSet.TYPE_FORWARD_ONLY,
        ResultSet.CONCUR_READ_ONLY,
        ResultSet.CLOSE_CURSORS_OVER_COMMIT
    );

设置参数值

创建后," CallableStatement"与" PreparedStatement"非常相似。例如,我们可以在放置?的位置将参数设置到SQL中。 。这是一个例子:

CallableStatement callableStatement =
    connection.prepareCall("{call calculateStatistics(?, ?)}");

callableStatement.setString(1, "param1");
callableStatement.setInt   (2, 123);

执行CallableStatement

设置完需要设置的参数值后,就可以执行CallableStatement了。这是完成的方式:

ResultSet result = callableStatement.executeQuery();

如果存储过程返回一个" ResultSet",则使用" executeQuery()"方法。

如果存储过程只是更新数据库,则可以改为调用executeUpdate()方法,如下所示:

callableStatement.executeUpdate();

批量更新

我们可以将对存储过程的多个调用分组为一个批处理更新。这是完成的方式:

CallableStatement callableStatement =
    connection.prepareCall("{call calculateStatistics(?, ?)}");

callableStatement.setString(1, "param1");
callableStatement.setInt   (2, 123);
callableStatement.addBatch();

callableStatement.setString(1, "param2");
callableStatement.setInt   (2, 456);
callableStatement.addBatch();

int[] updateCounts = callableStatement.executeBatch();

OUT参数

存储过程可能返回" OUT"参数。也就是说,返回的值是对" ResultSet"的替代或者补充。执行完CallableStatement之后,我们可以从CallableStatement对象访问这些OUT参数。这是一个例子:

CallableStatement callableStatement =
    connection.prepareCall("{call calculateStatistics(?, ?)}");

callableStatement.setString(1, "param1");
callableStatement.setInt   (2, 123);

callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);

ResultSet result = callableStatement.executeQuery();
while(result.next()) { ... }

String out1 = callableStatement.getString(1);
int    out2 = callableStatement.getInt   (2);

建议我们在尝试访问任何" OUT"参数之前先处理" ResultSet"。出于数据库兼容性的原因,建议使用此方法。