13.4.4 使用CallableStatement调用存储过程

13.4.4 使用CallableStatement调用存储过程

下面的SQL语句可以在MySQL数据库中创建一个简单的存储过程。

1
2
3
4
5
6
delimiter $$
create procedure add_pro(a int,b int,out sum int)
begin
set sum = a +b;
end;
$$

上面的SQL语句将MySQL的语句结束符改为双美元符($$),这样就可以在创建存储过程中使用分号作为分隔符( MySQL默认使用分号作为语句结束符)。上面程序创建了名为add_pro的存储过程,该存储过程包含三个参数:ab是传入参数,而sum使用out修饰,是传出参数。
调用存储过程使用CallableStatement,可以通过ConnectionprepareCall()方法来创建CallableStatement对象,创建该对象时需要传入调用存储过程的SQL语句。调用存储过程的SQL语句总是这种格式:{call 过程名 (?,?,?,)},其中的问号作为存储过程参数的占位符。例如,如下代码就创建了调用上面存储过程的CallableStatement对象。
cstmt=conn.prepareCall("{call add_pro(?,?,?)");
存储过程的参数既有传入参数,也有传出参数。所谓传入参数就是Java程序必须为这些参数传入值,可以通过CallableStatementsetXxx()方法为传入参数设置值;
所谓传出参数就是Java程序可以通过该参数获取存储过程里的值, CallableStatement需要调用registerOutParameter()方法来注册该参数。如下代码所示:
cstmt.registerOutParameter(3, Types.INTEGER);
经过上面步骤之后,就可以调用CallableStatementexecute()方法来执行存储过程了,执行结束后通过CallableStatement对象的getXxx(int index)方法来获取指定传出参数的值。下面程序示范了如何来调用该存储过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
import java.sql.*;

public class CallableStatementTest
{
private String driver;
private String url;
private String user;
private String pass;
public void initParam(String paramFile) throws Exception
{
// 使用Properties类来加载属性文件
Properties props = new Properties();
props.load(new FileInputStream(paramFile));
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
pass = props.getProperty("pass");
}
public void callProcedure() throws Exception
{
// 1.加载驱动
Class.forName(driver);
try (
// 2.获取数据库连接
Connection conn = DriverManager.getConnection(url, user, pass);
// 3.使用Connection来创建一个CallableStatment对象
CallableStatement cstmt = conn
.prepareCall("{call add_pro(?,?,?)}"))
{
cstmt.setInt(1, 4);
cstmt.setInt(2, 5);
// 4.注册CallableStatement的第三个参数是int类型
cstmt.registerOutParameter(3, Types.INTEGER);
// 执行存储过程
cstmt.execute();
// 获取,并输出存储过程传出参数的值。
System.out.println("执行结果是: " + cstmt.getInt(3));
}
}
public static void main(String[] args) throws Exception
{
CallableStatementTest ct = new CallableStatementTest();
ct.initParam("mysql.ini");
ct.callProcedure();
}
}

运行上面程序将会看到这个简单存储过程的执行结果,传入参数分别是45,执行加法后传出总和9.