/**
* 使用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);
}
}
}