首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 調用資料庫預存程序完整實戰:IN/OUT 參數、游標、CRUD 操作與動態建立

     編輯:Java 相關知識

前言

透過 JDBC CallableStatement 調用預存程序是企業級應用常見需求。本文系統整理七大場景:無輸出參數、輸出 INT/VARCHAR、游標回傳、刪除/修改/查詢/新增資料、Java 動態建立並調用,附完整 SQL 與 Java 程式碼。

環境準備

  • 資料庫:SQL Server(範例語法),Oracle/MySQL 語法類似。
  • 驅動:sun.jdbc.odbc.JdbcOdbcDriver(舊版示範,實際建議用對應原生驅動)。
  • 連線字串:jdbc:odbc:mydata。

場景 A:無輸出參數

SQL

CREATE PROCEDURE getsum @n INT = 0 AS
DECLARE @sum INT, @i INT
SET @sum = 0; SET @i = 0
WHILE @i <= @n BEGIN SET @sum = @sum + @i; SET @i = @i + 1 END
PRINT 'the sum is ' + LTRIM(RTRIM(STR(@sum)))

Java

CallableStatement c = conn.prepareCall("{call getsum(?)}");
c.setInt(1, 100);
c.execute();

場景 B:輸出參數(INT / VARCHAR)

SQL(INT)

ALTER PROCEDURE getsum @n INT = 0, @result INT OUTPUT AS
-- 計算邏輯同前 --
SET @result = @sum

Java

CallableStatement c = conn.prepareCall("{call getsum(?,?)}");
c.setInt(1, 100);
c.registerOutParameter(2, Types.INTEGER);
c.execute();
System.out.println(c.getInt(2));

SQL(VARCHAR + 游標)

CREATE PROCEDURE CursorIntoProcedure @pname VARCHAR(8000) OUTPUT AS
DECLARE cur CURSOR FOR SELECT orderid FROM orders
DECLARE @v VARCHAR(5)
OPEN cur; SET @pname = ''
FETCH NEXT FROM cur INTO @v
WHILE @@FETCH_STATUS = 0 BEGIN
    SET @pname = @pname + ';' + @v
    FETCH NEXT FROM cur INTO @v
END
CLOSE cur; DEALLOCATE cur

Java

CallableStatement c = conn.prepareCall("{call CursorIntoProcedure(?)}");
c.registerOutParameter(1, Types.VARCHAR);
c.execute();
System.out.println(c.getString(1));

場景 C~F:CRUD 操作

操作SQL 關鍵點Java 關鍵 API
刪除DELETE ... WHERE StuID=@StuID,配合外鍵級聯c.setInt(1, id); c.execute(); 再查詢驗證
修改UPDATE ... SET StuName=@StuName WHERE StuID=@StuIDc.setInt(1, id); c.setString(2, name); c.execute();
查詢(模糊)SELECT ... WHERE customerid LIKE '%'+@cust+'%'c.setString(1, "Tom"); ResultSet rs = c.executeQuery();
新增INSERT INTO ... VALUES(@StuID,@StuName,@StuAddress)c.setInt(1,6); c.setString(2,"Liu"); c.setString(3,"wuhan"); c.execute();

場景 G:Java 動態建立並調用預存程序


Statement stmt = conn.createStatement();
stmt.executeUpdate("CREATE PROCEDURE OOP AS SELECT * FROM 學生成績表");
CallableStatement c = conn.prepareCall("{call OOP}");
ResultSet rs = c.executeQuery();
while (rs.next()) System.out.println(rs.getString("Chinese"));

關鍵注意事項

  1. 參數註冊順序:setXxx(IN)先於 registerOutParameter(OUT)。
  2. 資源關閉:ResultSet → Statement → Connection 依序關閉,建議用 try-with-resources。
  3. 驅動升級:生產環境請使用資料庫原生 JDBC 驅動(如 com.microsoft.sqlserver.jdbc.SQLServerDriver),避免 ODBC 橋接效能損耗。
  4. SQL 注入防範:預存程序本身參數化已防注入,但動態建立 SQL 時需謹慎。

總結

掌握 CallableStatement 的 IN/OUT/INOUT 參數綁定、游標處理、結果集讀取,能高效實現 Java 與資料庫預存程序的無縫整合,提升資料層效能與安全性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved