CallableStatement执行存储过程:
一、带有输入参数的存储过程:
1、准备工作:数据库中创建存储过程
2、在数据库中调用存储过程:
3、在jdbc中调用存储过程:
package sram.jdbc.connection;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import org.junit.Test;
import sram.util.jdbc.JdbcUtil;
/**
* 使用CablleStatement调用存储过程
*/
public class Demo6 {
/**
* 调用带有输入参数的存储过程
* CALL pro_findById(2);
*/
@Test
public void test1(){
Connection conn = null;
CallableStatement stmt = null;
ResultSet rs = null;
try {
//获取连接
conn = JdbcUtil.getConnection();
//准备sql
String sql = "CALL pro_findById(?)";//PreparedStatement的子接口,所以支持预编译
//预编译
stmt = conn.prepareCall(sql);
//设置参数
stmt.setInt(1, 2);
//发送参数
rs = stmt.executeQuery();//注意: 所有调用存储过程的sql语句都是使用executeQuery方法执行!
//遍历结果
while(rs.next()){
int id = rs.getInt("id");
String userName = rs.getString("userName");
String pwd = rs.getString("pwd");
System.out.println(id+","+userName+","+pwd);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
JdbcUtil.close(conn, stmt ,rs);
}
}
}
二、执行带有输出参数的存储过程:
1、准备工作:数据库中创建存储过程
-- 带有输出参数的存储过程
DELIMITER $
CREATE PROCEDURE pro_findById2(IN aid INT,OUT aname VARCHAR(20))
BEGIN
SELECT userName INTO aname FROM admin WHERE id=aid;
END $
2、在数据库中调用存储过程:
1)调用无结果显示
CALL pro_findById2(1,@userName);
2)显示结果:
3、在jdbc中调用存储过程:
/**
* 执行带有输出参数的存储过程
* CALL pro_findById2(1,@userName);
*/
@Test
public void test2(){
Connection conn = null;
CallableStatement stmt = null;
try {
//获取连接
conn = JdbcUtil.getConnection();
//准备sql
String sql = "CALL pro_findById2(?,?)"; //第一个?是输入参数,第二个?是输出参数
//预编译
stmt = conn.prepareCall(sql);
//设置输入参数
stmt.setInt(1, 1);
//设置输出参数,CallableStatement特有的方法(注册输出参数)
/**
* 参数一: 参数位置
* 参数二: 存储过程中的输出参数的jdbc类型 VARCHAR(20)
*/
stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
//发送参数,执行
stmt.executeQuery();//结果不是返回到结果集中,而是返回到输出参数中
//得到输出参数的值
/**
* 索引值: 预编译sql中的输出参数的位置
*/
String result = stmt.getString(2);//getXX方法专门用于获取存储过程中的输出参数
System.out.print(result);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
JdbcUtil.close(conn, stmt);
}
}