CallableStatement的使用(存储过程)


使用的是MySQL

现在数据库中添加几个存储过程如下

#创建存储过程
#1.空参
DELIMITER $$
CREATE PROCEDURE p1( )
BEGIN 
  INSERT INTO pp(NAME)VALUES('x1');
  INSERT INTO pp(NAME)VALUES('x2');
  SELECT * FROM pp;
END $$
DELIMITER ;

#2.带参
DELIMITER $$
CREATE PROCEDURE p2( IN nm VARCHAR(10) )
BEGIN
  INSERT INTO pp(NAME) VALUES(nm);
  SELECT * FROM pp;
END $$
DELIMITER ;

#3.带参,带返回值
DELIMITER $$
CREATE PROCEDURE p3(IN nm VARCHAR(10),OUT con INT )
BEGIN 
  INSERT INTO pp(NAME) VALUES(nm);
  SELECT COUNT(1) INTO con FROM pp;
  SELECT * FROM pp;
END $$
DELIMITER ;

在数据库中调用存储过程的方式如下:

#调用存储过程
#1.空参
CALL p1();
#2.带参
CALL p2('带参');
#3.带参,带返回值
CALL p3('有返回值',@con);
SELECT @con;

在Java中调用:

package cn.bl.v2;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Types;

import org.junit.Test;

import cn.bl.DBUtil;

/**
 * 存储过程的调用,一般不会在这里创建存储过程,而是只是调用
 * @author BarryLee
 * @2018年9月19日@下午4:40:02
 */
public class CallableStatementDemo {

    //空参调用
    @Test
    public void test1() throws Exception {
        Connection conn = DBUtil.getConnection();
        CallableStatement cs = conn.prepareCall("call p1()");//call p1 -- 不带括号也行
        cs.execute();
        conn.close();
    }

    //有参调用
    @Test
    public void test2()  throws Exception {
        Connection conn = DBUtil.getConnection();
        CallableStatement cs = conn.prepareCall("call p2('BarryLee')");
        cs.execute();
        conn.close();
    }

    //有参并有返回值调用
    @Test
    public void test3() throws Exception {
        Connection conn = DBUtil.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);
        //结果如下
        //jack tom prince littlef lkjl 小梨花 空杯 带参 有返回值 BarryLee BarryLee BarryLee i:12
    }
}


原文链接:https://blog.csdn.net/qq_38238041/article/details/82774944