使用CablleStatement调用存储过程

时间:2021-09-26 04:28:23

/**

 * 使用CablleStatement调用存储过程

 * @author APPle

 *

 */

public class Demo1 {

 

/**

 * 调用带有输入参数的存储过程

 * CALL pro_findById(4);

 */

@Test

public void test1(){

Connection conn = null;

CallableStatement stmt = null;

ResultSet rs = null;

try {

//获取连接

conn = JdbcUtil.getConnection();

 

//准备sql

String sql = "CALL pro_findById(?)"; //可以执行预编译的sql

 

//预编译

stmt = conn.prepareCall(sql);

 

//设置输入参数

stmt.setInt(1, 6);

 

//发送参数

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

 

//遍历结果

while(rs.next()){

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

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

String gender = rs.getString("gender");

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

}

 

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException(e);

} finally {

JdbcUtil.close(conn, stmt ,rs);

}

}

 

/**

 * 执行带有输出参数的存储过程

 * CALL pro_findById2(5,@NAME);

 */

@Test

public void test2(){

Connection conn = null;

CallableStatement stmt = null;

ResultSet rs = null;

try {

//获取连接

conn = JdbcUtil.getConnection();

//准备sql

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

 

//预编译

stmt = conn.prepareCall(sql);

 

//设置输入参数

stmt.setInt(1, 6);

//设置输出参数(注册输出参数)

/**

 * 参数一: 参数位置

 * 参数二: 存储过程中的输出参数的jdbc类型    VARCHAR(20)

 */

stmt.registerOutParameter(2, java.sql.Types.VARCHAR);

 

//发送参数,执行

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

 

//得到输出参数的值

/**

 * 索引值: 预编译sql中的输出参数的位置

 */

String result = stmt.getString(2); //getXX方法专门用于获取存储过程中的输出参数

 

System.out.println(result);

 

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException(e);

} finally {

JdbcUtil.close(conn, stmt ,rs);

}

}

}

 

-- 存储过程

-- 定义分隔符

DELIMITER $$

CREATE PROCEDURE proc_login()

BEGIN

   SELECT * FROM admin;

END $$

 

-- 调用

CALL proc_login;

 

public class App_call {

 

// 全局参数

private Connection con;

private Statement stmt;

private PreparedStatement pstmt;

private CallableStatement cstmt;  // 存储过程

private ResultSet rs;

 

 

// 程序中调用存储过程

@Test

public void testCall() throws Exception {

 

try {

//1 . 创建连接

con = JdbcUtil.getConnection();

//2.  创建执行存储过程的stmt对象

CallableStatement cstmt = con.prepareCall("CALL proc_login");

//3.  执行(存储过程)

rs = cstmt.executeQuery();

 

// 遍历结果,测试

if (rs.next()) {

String name = rs.getString("userName");

String pwd = rs.getString("pwd");

// 测试

System.out.println(name + pwd);

}

 

} catch (Exception e) {

e.printStackTrace();

}

}

}