資料庫端:建立測試表與預存程序
CREATE TABLE users_ning (
id INT PRIMARY KEY AUTO_INCREMENT,
pwd INT
);
INSERT INTO users_ning (pwd) VALUES (1234), (12345), (12), (123);
DELIMITER $$
CREATE PROCEDURE login_ning(IN p_id INT, IN p_pwd INT, OUT flag INT)
BEGIN
DECLARE v_pwd INT;
SELECT pwd INTO v_pwd FROM users_ning WHERE id = p_id;
IF v_pwd = p_pwd THEN
SET flag := 1;
ELSE
SELECT v_pwd; -- 除錯用
SET flag := 0;
END IF;
END$$
DELIMITER ;
Java 端:CallableStatement 呼叫
public class ProcedureDemo2 {
public static int login(int id, int pwd) throws Exception {
int flag = -1;
String sql = "{call login_ning(?,?,?)}";
Connection conn = DBUtils.getConnMySQL();
CallableStatement stmt = conn.prepareCall(sql);
// 設定 IN 參數
stmt.setInt(1, id);
stmt.setInt(2, pwd);
// 註冊 OUT 參數
stmt.registerOutParameter(3, Types.INTEGER);
stmt.execute();
flag = stmt.getInt(3); // 取得 OUT 參數
stmt.close();
DBUtils.dbClose();
return flag;
}
}
通用資料庫工具類 (DBUtils) 關鍵方法
getConnMySQL():從屬性檔讀取 URL/帳密,載入驅動,回傳 Connection。
dbClose():關閉 ResultSet、Statement、Connection。
- 支援
PreparedStatement 參數化查詢/更新/刪除/批次操作。
- 提供元資料查詢(
DatabaseMetaData、ResultSetMetaData)工具方法。
關鍵點提醒
- JDBC 呼叫預存程序固定語法:
{call proc_name(?,...)}。
OUT/INOUT 參數必須 registerOutParameter(index, sqlType) 註冊。
- 執行後用
getXxx(index) 取得輸出值,索引對應佔位符順序(從 1 開始)。
- 資源關閉順序:ResultSet → Statement → Connection,放在
finally 區塊。