从零开始学JDBC--1.8 CallableStatement-- 存储过程

1. 创建存储过程

mysql的存储过程创建(每种数据库的创建过程不同):

DELIMITER $
CREATE PROCEDURE pro_findById(IN sid INT)
BEGIN
    SELECT * FROM student WHERE id=sid;
END $

调用存储过程

CALL pro_findById(5);

使用java代码实现:


public class CallableStmtDemo1 {

    private Connection conn = null;
    private PreparedStatement pstmt = null;
    @Test
    public void testCall() {
        try {
            //1.获取数据库连接
            conn = JdbcUtil.getConnection();

            //2.准备sql
            String sql = "CALL pro_findById(?)";

            //3.预编译
            pstmt = conn.prepareStatement(sql);

            //4.设置参数
            pstmt.setInt(1, 5);

            /**
            * 注意:所有调用存储过程的sql语句都是使用executeQuery方法执行
            */
            ResultSet rs = pstmt.executeQuery();

            while(rs.next()){
                String name = rs.getString("name");
                String gender =rs.getString("gender");

                System.out.println("name---"+name+"  gender---"+gender);
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }
}

2.创建带有输出参数的存储过程

有输出参数的存储过程,在使用java调用时没有ResultSet返回,是通过输出参数来获取执行结果的

注意存储过程的写法,尤其是输出参数的赋值过程

DELIMITER $
CREATE PROCEDURE pro_findById2(IN sid INT,OUT sname VARCHAR(20))
BEGIN
    SELECT NAME INTO sname FROM student WHERE id=sid;
END $

调用存储过程

CALL pro_findById2(5,@name);

获取输出参数结果

SELECT @name;

java代码实现:

/**
     * CALL pro_findById2(5,@name);
     *
     *  SELECT @name;
     */
    @Test
    public void testCall2() {
        try {
            //1.获取数据库连接
            conn = JdbcUtil.getConnection();

            //2.准备sql
            String sql = "CALL pro_findById2(?,?)"; //第一个?是输入参数,第二个?是输出参数

            //3.预编译
            cstmt = conn.prepareCall(sql);

            //4.设置输入参数
            cstmt.setInt(1, 5);

            //5.设置输出参数(注册输出参数)
            /**
             * 参数一:参数位置
             * 参数二:存储过程中的输出参数的jdbc类型  VARCHAR(20)
             */
            cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);

            cstmt.executeQuery();//结果不是返回到结果集中,而是返回到输参数中

            //得到输出参数的值
            /**
             * 索引值:预编译sql中的输出参数的位置
             */
            String res = cstmt.getString(2);//专门获取存储过程中的输出参数

            System.out.println(res);

        } catch (Exception e) {
            e.printStackTrace();
        }


    }

需要注意的过程:

    // 注册输出参数类型
    cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);
    // 获取输出参数结果
    String res = cstmt.getString(2);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值