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
的存储过程,该存储过程包含三个参数:a
、b
是传入参数,而sum
使用out
修饰,是传出参数。
调用存储过程使用CallableStatement
,可以通过Connection
的prepareCall()
方法来创建CallableStatement
对象,创建该对象时需要传入调用存储过程的SQL
语句。调用存储过程的SQL
语句总是这种格式:{call 过程名 (?,?,?,)}
,其中的问号作为存储过程参数的占位符。例如,如下代码就创建了调用上面存储过程的CallableStatement
对象。
cstmt=conn.prepareCall("{call add_pro(?,?,?)");
存储过程的参数既有传入参数,也有传出参数。所谓传入参数就是Java
程序必须为这些参数传入值,可以通过CallableStatement
的setXxx()
方法为传入参数设置值;
所谓传出参数就是Java
程序可以通过该参数获取存储过程里的值, CallableStatement
需要调用registerOutParameter()
方法来注册该参数。如下代码所示:
cstmt.registerOutParameter(3, Types.INTEGER);
经过上面步骤之后,就可以调用CallableStatement
的execute()
方法来执行存储过程了,执行结束后通过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 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 { Class.forName(driver); try ( Connection conn = DriverManager.getConnection(url, user, pass); CallableStatement cstmt = conn .prepareCall("{call add_pro(?,?,?)}")) { cstmt.setInt(1, 4); cstmt.setInt(2, 5); 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(); } }
|
运行上面程序将会看到这个简单存储过程的执行结果,传入参数分别是4
、5
,执行加法后传出总和9
.
原文链接: 13.4.4 使用CallableStatement调用存储过程