连接器/J完全实现了java.sql.CallableStatement
接口。
有关MySQL存储过程的更多信息,请参考使用存储例程.
连接器/J通过JDBC公开存储过程功能CallableStatement
接口。
的值返回的存储过程inOutParam
增加1,和传入的字符串usinginputParam
作为一个结果集
:
例3.3 Connector/J:调用存储过程
CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), \ INOUT inOutParam INT) BEGIN DECLARE z INT;SET z = inOutParam + 1;SET inOutParam = z;选择inputParam;SELECT CONCAT('zyxw', inputParam);结束
要使用demoSp
,请按照以下步骤操作:
使用来准备可调用语句
Connection.prepareCall ()
.注意,您必须使用JDBC转义语法,并且围绕参数占位符的括号不是可选的:
例3.4 Connector/J: Using
Connection.prepareCall ()
进口java.sql.CallableStatement;...// //用两个参数准备对存储过程'demoSp'的调用// // //注意使用JDBC-escape语法({call…})// CallableStatement cStmt = conn.prepareCall("{call demoSp(?,)}”);cStmt。setString(1,“英语字母”);
请注意Connection.prepareCall ()
是一种昂贵的方法,因为驱动程序执行元数据检索来支持输出参数。出于性能原因,尽量减少不必要的调用Connection.prepareCall ()
通过重用CallableStatement
实例。注册输出参数(如果存在的话)
检索输出参数的值(参数指定为
出
或INOUT
当您创建存储过程时),JDBC要求在使用各种registerOutputParameter ()
的方法CallableStatement
接口:例3.5 Connector/J:注册输出参数
进口java.sql.Types;...// // Connector/J支持命名和索引//输出参数。您可以使用任意一种方法注册输出//参数,也可以使用任意一种//方法检索输出参数,而不管使用什么方法注册它们。// //下面的示例展示了如何使用//注册//输出参数的各种方法(当然,您应该//只使用每个参数的一个注册)。// // //注册第二个参数作为输出,并且//使用类型'INTEGER'作为从// getObject() // cStmt返回的值。Types.INTEGER registerOutParameter (2);// //注册命名参数'inOutParam',并且//使用'INTEGER'类型作为从// getObject() // cStmt返回的值。registerOutParameter(“inOutParam”,Types.INTEGER);...
设置输入参数(如果存在的话)
输入和输入/输出参数设置为
PreparedStatement
对象。然而,CallableStatement
还支持按名称设置参数:例3.6 Connector/J: Setting
CallableStatement
输入参数...// //通过index // cStmt设置参数。setString(1,“英语字母”);// //或者,使用//参数名// cStmt设置参数。setString(“inputParam”、“英语字母”);// //使用索引// cStmt设置'in/out'参数。setInt (2, 1);// //或者,通过名称// cStmt设置'in/out'参数。setInt (" inOutParam ", 1);...
执行
CallableStatement
,并检索任何结果集或输出参数。虽然
CallableStatement
支持调用任何声明
执行方法(executeUpdate ()
,executeQuery ()
或execute ()
),最灵活的调用方法是execute ()
,因为你不需要提前知道存储过程是否返回结果集:例3.7 Connector/J:检索结果和输出参数值
...布尔hadResults = cStmt.execute();// //处理所有返回的结果集// while (hadResults) {ResultSet rs = cStmt.getResultSet();//进程结果集…hadResults = cStmt.getMoreResults();} // //检索输出参数// // Connector/J支持基于索引和//基于名称的检索// int outputValue = cStmt.getInt(2);//基于索引的outputValue = cStmt.getInt("inOutParam");//基于名字的…