2008-12-28 33 views
5

在將變量插入到Java數據庫中之前,轉換變量的建議方法是什麼?我應該使用PreparedStatements來處理Java中的所有數據庫插入操作嗎?

據我所知,我可以使用PreparedStatement.setString()來轉義數據,但PreparedStatement似乎有點不切實際,如果我不打算再次運行相同的查詢..有沒有更好的方式來做到這一點沒有準備每個查詢?

+0

你可以一個進一步此,並且使用Hibernate(或其他ORM):那麼你可以(主要)避免在完全Java代碼混合SQL。 有一點與它的學習曲線(ESP集合。),但很多周圍的文檔和教程。 如果現有數據已構建爲Java bean的,則Hibernate可以使用這些:它甚至可以基於你的班表 - 或創建基於數據庫表你的Java bean。 – monojohnny 2010-01-15 00:49:15

回答

27

是的,使用準備好的語句的一切。

  1. 它們被解析一次。

  2. 它們免受SQL注入攻擊。

  3. 它們是一個更好的設計,因爲你必須考慮你的SQL以及它的使用方式。

如果您認爲他們只使用過一次,那麼您並沒有看大圖。有一天,你的數據或你的應用程序將會改變。


編輯。

爲什麼準備好的語句讓你思考你的SQL?

  • 當你組裝一個字符串(或簡單地執行文本的文本塊)你是不是創建一個新的PreparedStatement對象。你只是在執行SQL - 它可以非常隨便地完成。

  • 當你必須創建(並保存)一個PreparedStatement時,你必須更多地考慮封裝,責任分配。準備語句是進行任何SQL處理之前的有狀態事件。

額外的工作是小的,但不是微不足道的。這就是人們開始思考ORM和數據緩存層的原因,以及類似的東西來優化他們的數據庫訪問。

通過Prepared語句,數據庫訪問不那麼隨意,更有意。

+0

我不會說免疫,但保護。 – Milhous 2008-12-29 02:22:04

+0

@Milhous。不同意。使用綁定變量和靜態SQL文本準備的語句是免疫的。完全。 – 2008-12-29 02:27:20

+0

你假定綁定中沒有錯誤。不要誤解我的意思,我所使用的都是準備好的陳述。 – Milhous 2008-12-29 03:37:08

4

準備一個陳述並不昂貴。它比大多數替代品更安全。

9

您不應該使用字符串連接自己構造SQL查詢。構建SQL查詢時,絕不應該手動轉義變量/用戶數據。所需的實際轉義取決於您的基礎數據庫,並且在某些時候有人會忘記轉義。

重點是這樣的:用準備好的語句,它是不可能來創建一個SQL注入語句。隨着自定義轉義,這是可能的。選擇是顯而易見的。

3

我聽說過PreparedStatement比普通Statement花費一點額外開銷的觀點,如果我沒有將用戶輸入連接到我的查詢中,它應該是安全的。這可能是事實,但額外的成本並沒有那麼多,並且SQL查詢隨着時間而改變。如果你開始今天使用語句,因爲你已經證明自己,你的查詢是注射證明,你是在和自己的上一個維護程序員改變SQL來接受用戶輸入的一天失敗,但不認爲將該聲明更改爲PreparedStatement。我的建議是在找到你之前總是使用PreparedStatement來避免麻煩。

3

更妙的是,不要直接使用JDBC API,因爲它是如此容易出錯(例如無法在所有情況下正確清理所有資源)。使用Spring的JdbcOperations接口等JDBC助手對象,這可以大大減少代碼的大小和繁瑣程度。如果您只使用Spring來實現這一功能,那麼與直接使用JDBC API相比,您仍然對自己產生了極大的興趣。

相關問題