1. 程式人生 > >java中如何呼叫資料庫的儲存過程

java中如何呼叫資料庫的儲存過程

CallableStatement執行儲存過程

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