⑴ 預編譯SQL語句的使用問題
void setString(int parameterIndex,
String x)
PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");
pstmt 對象包含語句 "UPDATE table4 SET m = ? WHERE x = ?",它已發送給DBMS,並為執行作好了准備。
2、傳遞 IN 參數
在執行 PreparedStatement 對象之前,必須設置每個 ? 參數的值。這可通過調用 setXXX 方法來完成,其中 XXX 是與該參數相應的類型。例如,如果參數具有Java 類型 long,則使用的方法就是 setLong。setXXX 方法的第一個參數是要設置的參數的序數位置,第二個參數是設置給該參數的值。例如,以下代碼將第一個參數設為 123456789,第二個參數設為 100000000:
pstmt.setLong(1, 123456789);
pstmt.setLong(2, 100000000);
一旦設置了給定語句的參數值,就可用它多次執行該語句,直到調用clearParameters 方法清除它為止。在連接的預設模式下(啟用自動提交),當語句完成時將自動提交或還原該語句。
如果基本資料庫和驅動程序在語句提交之後仍保持這些語句的打開狀態,則同一個 PreparedStatement 可執行多次。如果這一點不成立,那麼試圖通過使用PreparedStatement 對象代替 Statement 對象來提高性能是沒有意義的。
利用 pstmt(前面創建的 PreparedStatement 對象),以下代碼例示了如何設置兩個參數佔位符的值並執行 pstmt 10 次。如上所述,為做到這一點,資料庫不能關閉 pstmt。在該示例中,第一個參數被設置為 "Hi"並保持為常數。在 for 循環中,每次都將第二個參數設置為不同的值:從 0 開始,到 9 結束。
pstmt.setString(1, "Hi");
for (int i = 0; i < 10; i++) {
pstmt.setInt(2, i);
int rowCount = pstmt.executeUpdate();
}
⑵ 資料庫預編譯語句in(查詢條件),如果查詢條件只有一個,可以運行,如果多個條件,則不能運行,為什麼
你這個是把usercode的值作為變數給了語句里的?
這時候就有個問題
你的userCode是string類型的數組吧。。。
那麼傳進去的應該是'10086','10087'
如果不是這個問題你就在執行SQL語句之前先輸出一下語句 日誌里看看是哪裡格式不對了
⑶ sql中帶有like時如何使用預編譯
like語句實際上就是模糊的欄位查詢,通常與「%」(一個或多個)結合使用。
舉例說明:
sql:SELECT * FROM tablename T WHERE T.name LIKE '%zhang%';
解釋:以上語句就就是查詢出tablename表中name欄位帶有「zhang」的所有記錄。
備註:存儲過程中用"||"表示連接符,用單引號(「'」)表示字元連接。
SELECT * FROM tablename T WHERE T.name LIKE '%'||'zhang'||'%'.
⑷ 用預編譯的方式查詢是不是能夠杜絕SQL注入
是的,預編譯有個類是PreparedStatement.
這個類的對象是通過參數?來傳值的
例:
String sql = "select * from table where id = ?";
Connection con = .....///這里得到是資料庫的連接
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1,id);//這里的資料庫語句所用到的參數要被設置的,如果你傳入了錯的值,或不同類型的值,它在插入到資料庫語句中會編譯不通過,這也就防止了SQL注入。