通过JDBC API调用存储过程的范例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过JDBC API调用存储过程的范例相关的知识,希望对你有一定的参考价值。

通过JDBC API调用存储过程

以下内容参考孙卫琴所写的《Java网络编程核心技术详解》一书的第12章。
源代码下载地址为:http://lesson.javathinker.net/javanet/javanetsourcecode.rar

java.sql.CallableStatement接口用来执行数据库中的存储过程。Connection的prepareCall()方法创建一个CallableStatement对象。假设mysql数据库中有一个名为demoSp的存储过程,它的定义如下:

delimiter  //
CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), INOUT inOutParam INT)
BEGIN
    DECLARE z INT;
    SET z = inOutParam + 1;
    SET inOutParam = z;

    SELECT CONCAT(‘hello ‘, inputParam);
END  //

以上代码位于配套源代码包的sourcecode/chapter12/sql/demoSp.sql中。以上存储过程有两个参数,第一个参数inputParam是VARCHAR类型,并且是输入(IN)参数,第二个参数inOutParam是INT类型,并且是输入输出(INOUT)参数。对于输入输出参数,调用者既可以向存储过程传入参数值,也可以在存储过程执行完毕后读取被更新的参数值。以下ProcedureTester类演示如何调用该存储过程。

/ ProcedureTester.java /

import java.sql.*;
public class ProcedureTester{
public static void main(String args[])throws Exception{
//加载驱动器,下面的代码为加载MySQL驱动器
Class.forName("com.mysql.cj.jdbc.Driver");

//连接到数据库的URL,serverTimeZone表示时区
String dbUrl = "jdbc:mysql://localhost:3306/STOREDB"
               + "?serverTimezone=Asia/Shanghai";
String dbUser="dbuser";
String dbPwd="1234";
//建立数据库连接
Connection con = DriverManager.getConnection(dbUrl,dbUser,dbPwd);
//创建一个调用demoSp存储过程的CallableStatement对象。
CallableStatement cStmt = con.prepareCall("{call demoSp(?, ?)}");
//设置第一个参数的值
cStmt.setString(1, "Tom"); //按索引位置指定参数
//cStmt.setString("inputParam", "Tom"); //按名字指定参数

//注册第二个参数的类型
cStmt.registerOutParameter(2, Types.INTEGER); //按索引位置指定参数
//按名字指定参数
//cStmt.registerOutParameter("inOutParam", Types.INTEGER);

//设置第二个参数的值
cStmt.setInt(2, 1); //按索引位置指定参数
//cStmt.setInt("inOutParam", 1); //按名字指定参数

//执行存储过程
boolean hadResults = cStmt.execute();

//访问结果集
if (hadResults) {
  ResultSet rs = cStmt.getResultSet();
  //SQLExecutor类参见12.4.4节的例程12-8
  SQLExecutor.showResultSet(rs);
}

//获得第二个参数的输出值
int outputValue = cStmt.getInt(2); //按索引位置指定参数
//int outputValue = cStmt.getInt("inOutParam"); //按名字指定参数

con.close();

}
}

创建CallableStatement对象的代码如下:

CallableStatement cStmt = con.prepareCall("{call demoSp(?, ?)}");

以上两个问号分别代表存储过程的两个参数。可通过以下两种方式为参数赋值:

//方式一:指定参数的索引位置
cStmt.setString(1, "Tom");
cStmt.setInt(2, 1);

//方式二:指定参数的名字    
cStmt.setString("inputParam", "Tom");
cStmt.setInt("inOutParam", 1);

第二个参数为输入输出参数,为了获得它的输出值,必须先通过CallableStatement 的registerOutParameter()方法注册参数的类型,然后就可以在存储过程执行完毕后通过相应的getXXX()方法获得它的输出值。

以上是关于通过JDBC API调用存储过程的范例的主要内容,如果未能解决你的问题,请参考以下文章

Java数据库连接--JDBC调用存储过程,事务管理和高级应用

通过 JDBC 调用 Sybase 存储过程时的空结果集

Java数据库连接——JDBC调用存储过程,事务管理和高级应用

Java调用SQL Server的存储过程详解(转)

关于jdbc调用存储过程的问题

JDBC 调用自定义函数(常说的存储过程)的步骤