Connector/J 完全实现了
java.sql.CallableStatement
接口。
有关 MySQL 存储过程的更多信息,请参阅 使用存储例程。
Connector/J 通过 JDBC 的CallableStatement
接口公开存储过程功能。
以下示例显示了一个存储过程,该过程返回递增 1 的值,并使用as a
inOutParam
传入的字符串:
inputParam
ResultSet
示例 7.3 连接器/J:调用存储过程
CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), \
INOUT inOutParam INT)
BEGIN
DECLARE z INT;
SET z = inOutParam + 1;
SET inOutParam = z;
SELECT inputParam;
SELECT CONCAT('zyxw', inputParam);
END
要使用demoSp
连接器/J 的过程,请执行以下步骤:
-
使用 准备可调用语句
Connection.prepareCall()
。请注意,您必须使用 JDBC 转义语法,并且参数占位符周围的括号不是可选的:
示例 7.4 连接器/J:使用
Connection.prepareCall()
import java.sql.CallableStatement; ... // // Prepare a call to the stored procedure 'demoSp' // with two parameters // // Notice the use of JDBC-escape syntax ({call ...}) // CallableStatement cStmt = conn.prepareCall("{call demoSp(?, ?)}"); cStmt.setString(1, "abcdefg");
笔记Connection.prepareCall()
是一种昂贵的方法,因为驱动程序执行元数据检索以支持输出参数。Connection.prepareCall()
出于性能原因,通过在代码中重复使用CallableStatement
实例 来最大程度地减少不必要的调用 。 -
注册输出参数(如果存在)
要检索输出参数的值(在创建存储过程时指定的参数
OUT
) ,JDBC 要求在使用接口中的各种方法INOUT
执行语句之前指定它们 :registerOutputParameter()
CallableStatement
示例 7.5 连接器/J:注册输出参数
import java.sql.Types; ... // // Connector/J supports both named and indexed // output parameters. You can register output // parameters using either method, as well // as retrieve output parameters using either // method, regardless of what method was // used to register them. // // The following examples show how to use // the various methods of registering // output parameters (you should of course // use only one registration per parameter). // // // Registers the second parameter as output, and // uses the type 'INTEGER' for values returned from // getObject() // cStmt.registerOutParameter(2, Types.INTEGER); // // Registers the named parameter 'inOutParam', and // uses the type 'INTEGER' for values returned from // getObject() // cStmt.registerOutParameter("inOutParam", Types.INTEGER); ...
-
设置输入参数(如果存在)
输入和输入/输出参数设置为
PreparedStatement
对象。但是,CallableStatement
也支持按名称设置参数:例 7.6 连接器/J:设置
CallableStatement
输入参数... // // Set a parameter by index // cStmt.setString(1, "abcdefg"); // // Alternatively, set a parameter using // the parameter name // cStmt.setString("inputParam", "abcdefg"); // // Set the 'in/out' parameter using an index // cStmt.setInt(2, 1); // // Alternatively, set the 'in/out' parameter // by name // cStmt.setInt("inOutParam", 1); ...
-
执行
CallableStatement
,并检索任何结果集或输出参数。尽管
CallableStatement
支持调用任何Statement
执行方法(executeUpdate()
,executeQuery()
或execute()
),但最灵活的调用方法是execute()
,因为您无需提前知道存储过程是否返回结果集:示例 7.7 连接器/J:检索结果和输出参数值
... boolean hadResults = cStmt.execute(); // // Process all returned result sets // while (hadResults) { ResultSet rs = cStmt.getResultSet(); // process result set ... hadResults = cStmt.getMoreResults(); } // // Retrieve output parameters // // Connector/J supports both index-based and // name-based retrieval // int outputValue = cStmt.getInt(2); // index-based outputValue = cStmt.getInt("inOutParam"); // name-based ...