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

PreparedStatement 佔位符 (?) 完整用法指南與實戰範例

     編輯:Java 綜合教學

PreparedStatement 佔位符 (?) 核心概念與優勢

在 Java 資料庫開發中,PreparedStatement 是執行參數化 SQL 語句的核心介面。相較於傳統 Statement,它最大的特色在於使用「佔位符」來預編譯 SQL,這不僅能有效防止 SQL 注入攻擊,還能透過預編譯機制提升重複執行的效能。

資料表結構準備

範例使用的 Student 資料表結構如下:

欄位名型別說明
IDINT學號(主鍵)
nameVARCHAR姓名
genderVARCHAR性別

完整 Java 實作範例

public class PreparedStatementDemo {
    public static void main(String[] args) {
        int id = 1;
        String name = "張三";
        String gender = "男";
        
        Connection conn = null;
        PreparedStatement ps = null;
        
        try {
            // 1. 載入 JDBC 驅動程式
            Class.forName("com.mysql.jdbc.Driver");
            
            // 2. 建立資料庫連線
            conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/mysql", "root", "111111");
            
            // 3. 定義參數化 SQL(使用 ? 作為佔位符)
            String sql = "INSERT INTO student VALUES (?, ?, ?)";
            
            // 4. 建立 PreparedStatement 物件
            ps = conn.prepareStatement(sql);
            
            // 5. 依序設定參數值(索引從 1 開始)
            ps.setInt(1, id);
            ps.setString(2, name);
            ps.setString(3, gender);
            
            // 6. 執行更新並取得影響筆數
            int result = ps.executeUpdate();
            System.out.println("異動筆數:" + result);
            
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            // 7. 關閉資源(遵循先開後關原則)
            closeQuietly(ps);
            closeQuietly(conn);
        }
    }
    
    private static void closeQuietly(AutoCloseable resource) {
        if (resource != null) {
            try { resource.close(); } catch (Exception ignored) {}
        }
    }
}

關鍵技術細節解析

1. 佔位符索引規則

  • 索引從 1 開始,非 0
  • 對應 SQL 中 ? 的出現順序
  • 必須與 setter 方法型別匹配(setInt、setString、setDate 等)

2. 預編譯機制優勢

資料庫在第一次執行時會解析、編譯、優化 SQL 並快取執行計畫。後續相同 SQL 只需傳入新參數即可直接執行,大幅降低解析開銷。

3. 防止 SQL 注入原理

參數值會被視為純資料而非 SQL 片段,資料庫引擎不會將其解釋為指令,從根本上杜絕注入風險。

執行結果驗證

程式執行後,資料表將新增一筆記錄:

IDnamegender
1張三男

控制台輸出:異動筆數:1

最佳實務建議

  1. 永遠使用 try-with-resources(Java 7+)自動管理資源關閉
  2. 批次處理大量資料時使用 addBatch() + executeBatch()
  3. 明確指定欄位名:INSERT INTO student (id, name, gender) VALUES (?, ?, ?)
  4. 設定適當的 fetchSize優化大量查詢效能
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved