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); } }