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"。出于数据库兼容性的原因,建议使用此方法。