❶ statement和preparestatement的區別
Statement用於執行靜態sql語句,在執行時,必須指定一個事先准備好的sql語句。
PrepareStatement是預編譯的sql語句對象,sql語句被預編譯並保存在對象中。被封裝的sql語句代表某一類操作,語句中可以包含動態參數「?」,在執行時可以為「?」動態設置參數值。
(1)sql預編譯和執行的語法擴展閱讀
使用PrepareStatement對象執行sql時,sql被資料庫進行解析和編譯,然後被放到命令緩沖區,每當執行同一個PrepareStatement對象時,它就會被解析一次,但不會被再次編譯。在緩沖區可以發現預編譯的命令,並且可以重用。
PrepareStatement可以減少編譯次數提高資料庫性能。
結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統。
結構化查詢語言是高級的非過程化編程語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式,所以具有完全不同底層結構的不同資料庫系統, 可以使用相同的結構化查詢語言作為數據輸入與管理的介面。結構化查詢語言語句可以嵌套,這使它具有極大的靈活性和強大的功能。
❷ mybatis通過預編譯進行參數拼接的符號
#{}佔位轎帶符:佔位使用#{}意味著使用的預編譯的語句,即在使用jdbc時的preparedStatement,sql語句中如果存在參數則會使用?作佔位符,我仔帆粗們知道這種方式可以防止sql注入,並且在使用#{}時形成的sql語句,已經帶有引號,例,select * from table1 where id=#{id} 在調用這念鎮個語句時我們可以通過後台看到列印出的sql為:select * from table1 where id=『2』 加入傳的值為2.也就是說在組成sql語句的時候把參數默認為字元串。如果傳入的是基本類型,那麼#{}中的變數名稱可以隨意寫如果傳入的參數是pojo類型,那麼#{}中的變數名稱必須是pojo中的屬性.屬性.屬性?${}拼接符:字元串原樣拼接如果傳入的是基本類型,那麼${}中的變數名必須是value如果傳入的參數是pojo類型,那麼${}中的變數名稱必須是pojo中的屬性.屬性.屬性?注意:使用拼接符有可能造成sql注入使用${}時的sql不會當做字元串處理,是什麼就是什麼,如上邊的語句:select * from table1 where id=${id} 在調用這個語句時控制台列印的為:select * from table1 where id=2 ,假設傳的參數值為2從上邊的介紹可以看出這兩種方式的區別,我們最好是能用#{}則用它,因為它可以防止sql注入,且是預編譯的,在需要原樣輸出時才使用${},如,select * from ${tableName} order by ${id} 這里需要傳入表名和按照哪個列進行排序 ,加入傳入table1、id 則語句為:select * from table1 order by id如果是使用#{} 則變成了select * from 『table1』 order by 『id』 我們知道這樣就不對了。另,在使用以下的配置時,必須使用#{}
❸ 預編譯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();
}