CallableStatement的所有超级接口为PreparedStatement、Statement、Wrapper。其中继承自PreparedStatement接口。CallableStatement主要是调用数据库中的存储过程。在使用CallableStatement时可以接收存储过程的返回值。CallableStatement对象为所有的DBMS提供了一种标准的形式去调用数据库中已存在的存储过程。
1、在MySQL中创建存储过程。注意:MySQL 5.0以前版本不支持存储过程
#1.空参
DELIMITER $$
CREATE PROCEDURE p1( )
BEGIN
INSERT INTO user(NAME)VALUES('x1');
INSERT INTO user(NAME)VALUES('x2');
SELECT * FROM user;
END $$
DELIMITER ;
#2.带参
DELIMITER $$
CREATE PROCEDURE p2( IN nm VARCHAR(10) )
BEGIN
INSERT INTO user(NAME) VALUES(nm);
SELECT * FROM user;
END $$
DELIMITER ;
#3.带参,带返回值
DELIMITER $$
CREATE PROCEDURE p3(IN nm VARCHAR(10),OUT con INT )
BEGIN
INSERT INTO user(NAME) VALUES(nm);
SELECT COUNT(1) INTO con FROM user;
SELECT * FROM user;
END $$
DELIMITER ;
2、在数据库中调用存储过程
#1.空参
CALL p1();
#2.带参
CALL p2('带参');
#3.带参,带返回值
CALL p3('有返回值',@con);
SELECT @con;
3、使用CallableStatement调用存储过程
package com.atguigu.jdbc;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Types;
import org.junit.Test;
public class CallableStatementDemo {
//空参调用
@Test
public void test1() throws Exception {
Connection conn = JDBCTools.getConnection();
CallableStatement cs = conn.prepareCall("call p1()"); //call p1 也可以不带括号
cs.execute();
conn.close();
}
//有参调用
@Test
public void test2() throws Exception {
Connection conn = JDBCTools.getConnection();
CallableStatement cs = conn.prepareCall("call p2('BarryLee')");
cs.execute();
conn.close();
}
//有参并有返回值调用
@Test
public void test3() throws Exception {
Connection conn = JDBCTools.getConnection();
CallableStatement cs = conn.prepareCall("call p3(?,?)");
cs.setString(1, "BarryLee");
cs.registerOutParameter(2, Types.INTEGER); //注册一个输出参数
cs.execute();//执行
ResultSet set = cs.getResultSet(); //获取输出结果
while(set.next()) {
System.out.print(set.getString("name")+" ");
}
//获取输出参数的结果
int i = cs.getInt(2); //之前注册的第几个就是多少
System.out.println("i:"+i);
}
}