mysql preparedstatement 执行存储过程_JDBC基础篇(MYSQL)——使用CallabeStatement调用存储过程...

smile.gif注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接:

package day04_callable;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import util.JdbcUtil;

/**

* CallabeStatement:存储过程的statement

*

1. 首先创建一个存储过程:查询所有的用户

DELIMITER $

CREATE PROCEDURE select_allStudent()

BEGIN

SELECT * FROM student;

END $

CALL select_allStudent();

2. 输入一个id,查询id对应的用户

DELIMITER $

CREATE PROCEDURE select_studentById(IN sid INT)

BEGIN

SELECT * FROM student WHERE id = sid; -- 注意

END $

CALL select_studentById(10);

3. 创建一个有输出参数的存储过程

DELIMITER $

CREATE PROCEDURE get_studentName(IN sid INT,OUT sname VARCHAR(20))

BEGIN

SELECT NAME INTO sname FROM student WHERE id = sid;

END $

CALL get_studentName(10, @sname);

SELECT @sname;

-- 注意输出参数不在ResultSet结果集中,应该在输出参数中

继承关系:

Statement

-->PrapredStatement

---->CallableStatement

@author mzy

*/

public class Demo01 {

public static void main(String[] args) {

// testIn();

testOut();

}

private static void testOut() {

Connection conn = null;

CallableStatement cstmt = null;

ResultSet rs = null;

String sql = "call get_studentName(?, ?)"; //不管是输入还是输出,都可以用 ? 来代替这个参数

conn = JdbcUtil.getConnection();

try {

cstmt = conn.prepareCall(sql);

/**

* 设置输入参数

*/

cstmt.setInt(1, 10); // 来自preparedStatement:只有preparedStatement才有预编译的功能

/**

* 设置输出参数:

* 第一个参数同样是位置下标

* 第二个参数是存储过程中,那个输出参数的类型

*

* 此方法就是注册输出参数的类型:

* 因为是注册输出参数的是mysql中的操作,注册的输出参数也必须是mysql中的数据类型

*

* 通过 java.sql.Types.XXX:就可以获得其中的sql的类型

*/

cstmt.registerOutParameter(2, java.sql.Types.VARCHAR); // 因为我们的out参数是varchar

// 发送参数:结果并不在resultSet中

// 这里并不需要rs结果集:因为我们是带返回参数的存储过程,并没有查询结果集

/*rs = */cstmt.executeQuery(); // 注意:存储过程只能执行Query方法,也只有query方法!!!

// 结果在输出参数中,我们应该在输出参数中查看结果

// 这里的参数位置和我们的输出参数的位置是保持一致的

// 通过getXXX方法;但是这里的getXXX方法,和resultSet中的getXXX方法不同

// 这里的getXXX方法是callableStatement提供的,专门针对存储过程的out参数的

// 而resultSet中的getXXX方法是获取列的值的

String sname = cstmt.getString(2);

System.out.println(sname);

} catch (SQLException e) {

e.printStackTrace();

} finally {

JdbcUtil.close(rs, cstmt, conn);

}

}

private static void testIn() {

Connection conn = null;

CallableStatement cstmt = null;

ResultSet rs = null;

String sql = "call select_studentById(?)";

conn = JdbcUtil.getConnection();

try {

cstmt = conn.prepareCall(sql);

cstmt.setInt(1, 10);

rs = cstmt.executeQuery(); // 注意:存储过程只能执行Query方法,也只有query方法!!!

while(rs.next()) {

int id = (int)rs.getObject("id"); // rs.getInt("id");

String name = (String)rs.getObject("name"); // rs.getString("name");

int age = (int)rs.getObject("age"); // rs.getInt("age");

System.out.println(id+", "+name+", "+age);

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

JdbcUtil.close(rs, cstmt, conn);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值