使用 PreparedStatement

開放

報表類型

我們已經看到了最簡單的Statement接口。雖然它非常適合工作,但不太適合複雜的查詢。在一些消息來源中,表達的意見是根本沒有必要使用Statement - 更複雜和功能更豐富的接口才是合適的。

  • PreparedStatement
  • 可調用語句

一個相當合理的問題出現了——為什麼需要這些接口?讓我們弄清楚。

首先,我們將看一下PreparedStatement接口和其他 JDBC 功能。稍後我們將轉向CallableStatement接口- 首先,它的使用並不常見,其次,在考慮了所有因素之後,對話已經可以變得很短了。

此外,PreparedStatement對稱為 SQL 注入的流行數據庫黑客攻擊方法有很大幫助。

但稍後會詳細介紹。

PreparedStatement

如果你嘗試翻譯名稱PreparedStatement,你會得到類似“準備好的語句”的東西。這裡最重要的詞是“準備”。什麼是“準備”?

在我們考慮這個問題之前,我建議從經常發生的便利性的角度來看一個相當重要的觀點。因此,在某些應用程序中,我們需要將聯繫人數據插入到 CONTACT 表中。為此,我們需要準備如下查詢:

INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (‘Harry’,'Potter','+79112345678','harry@example.com);

乍一看,似乎一切都沒有那麼困難和可怕。我們需要編寫一段代碼,從參數中收集我們需要的字符串:名字、姓氏、地址和電話號碼。您只需要記住所有字符串數據都必須用單引號字符括起來。

如果我們在一個單獨的函數中執行此操作,那麼我們會得到如下內容:

public String buildInsert(String firstName,, String lastName, String phone, String email) {
    String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL)+VALUES ('" + firstName + "','" + lastName + "','" + phone + "','" + email + ")";
    return sql;
}

我們將名字、姓氏、電話號碼和地址傳遞給表單中的參數函數,並從中組成一個 SQL 查詢字符串。行情稍微破壞了畫面,但到目前為止還不可怕。

好的,數字呢?它們不需要被引號包圍。Opanki,在一種情況下你需要引號,在另一種情況下你不需要。情況越來越複雜。

現在讓我們再增加一個問題——如果字符串中有一個普通的引號(甚至一個都沒有)怎麼辦?您必須首先尋找此類報價並進行處理。Mdaaa。不知何故,我們開始感到不舒服。

如果我們現在添加日期處理,那麼任務就會變得非常無聊——你必須做大量的工作。日期通常令人不快——不同的 SQL 服務器接受不同的日期格式。

那麼我們看到了什麼?如果我們需要在查詢中使用參數,那麼手動構建查詢就變得非常不愉快。不僅令人不快——我什至會說無聊。有大量的案例需要考慮,這是一項非常無聊的工作。PreparedStatement接口基本上就是針對這種情況提出來的。

這個請求允許你做兩件事:

  • 提前準備一個請求,指出參數將被替換的地方
  • 設置某種類型的參數,然後使用已設置的參數執行查詢

PreparedStatement 示例

我們設置參數選項的PreparedStatement結構如下所示:

// Example variables
String firstName = "Harry";
String lastName = "Potter";
String phone = "+12871112233";
String email = "harry@example.com";

// Request with indication of places for parameters in the form of "?"
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (?, ?, ?, ?)";

// Create a request. The con variable is an object of type Connection
PreparedStatement stmt = con.prepareStatement(sql);

// Set parameters
stmt.setString(1, firstName);
stmt.setString(2, lastName);
stmt.setString(3, phone);
stmt.setString(4, email);

// Execute the request
stmt.executeUpdate();

如您所見,一切都非常簡單。

首先,在寫SQL查詢時,需要代入參數的地方都寫上了問號——“?”。

其次,請求是通過調用con.prepareStatement()創建的。

第三,參數的設置通過數字和數值的指示。請注意,參數的數量從 1 開始,而不是從 0 開始,就像我們在處理數組和集合時習慣的那樣。

PreparedStatement接口包含用於設置字符串的方法 — setString(),用於設置數字的方法 — setInt()setLong()setDouble(),用於設置日期的方法 — setDate()。和更複雜的類型——這可以在文檔中看到。

第四,對stmt.executeUpdate()的調用已在未指定查詢字符串的情況下執行。

我強烈推薦與PreparedStatement交朋友——這是一個非常有效的工具。

留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言