使用CallableStatement执行存储过程

时间:2022-11-15 23:00:18


使用CallableStatement执行存储过程

package com.cn.callableStatement;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import org.junit.Test;
import com.cn.Util.JdbcUtil;
/***
* 使用CallableStatement调用存储过程
* @author liuzhiyong
*
*/
public class Demo1 {

private Connection conn;
private CallableStatement cstmt;
/**
* 使用CallableStatement调用带输入参数的存储过程
*/
@Test
public void test1(){
Connection conn = null;
CallableStatement cstmt = null;
ResultSet rs = null;
try{
// 获取连接
conn = JdbcUtil.getConnection();
//准备sql
String sql = "CALL pro_findById(?)";
//预编译
cstmt = conn.prepareCall(sql);
//设置参数
cstmt.setInt(1, 2);
//发送参数,执行sql
rs = cstmt.executeQuery();//注意:所有调用存储过程的sql语句都是使用executeQuery方法执行。

//遍历结果集
while(rs.next()){
System.out.println(rs.getInt("id") + "#" + rs.getString("name") + "#" + rs.getString("password"));//这里的 getXXX()方法是获取结果集中的结果
}
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}finally{
JdbcUtil.close(conn, cstmt, rs);
}
}

/**
* 使用CallableStatement调用带输入参数输出参数的存储过程
*/
@Test
public void test2(){
Connection conn = null;
CallableStatement cstmt = null;
ResultSet rs = null;
try{
// 获取连接
conn = JdbcUtil.getConnection();
//准备sql
String sql = "CALL pro_getNameById(?,?)";
//预编译
cstmt = conn.prepareCall(sql);
//设置输入参数
cstmt.setInt(1, 2);
/**
* 设置输出参数(注册输出参数)
* 参数一:参数位置
* 参数二:存错过程中的输出参数的jdbc类型 varchar(20)
*/
cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);
//发送参数,执行sql
cstmt.executeQuery();//这里没有结果集返回。结果不是返回到结果集中,而是返回到输出参数中。注意:所有调用存储过程的sql语句都是使用executeQuery方法执行。

/**
* 得到输出参数的值
* 索引值:预编译sql中的输出参数的位置
*/
String result = cstmt.getString(2);//这里的getXXXX()方法是专门用于获取存储过程中的输出参数
System.out.println(result);
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}finally{
JdbcUtil.close(conn, cstmt, rs);
}
}
}