大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 詳解JDBC中的PreparedStatement

詳解JDBC中的PreparedStatement

更新時間:2021-02-24 17:42:11 來源:動力節點 瀏覽1331次

PreparedStatement是用來執行SQL查詢語句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三種方式來執行查詢語句,其中 Statement 用于通用查詢,PreparedStatement 用于執行參數化查詢,而 CallableStatement則是用于存儲過程。同時PreparedStatement還經常會在Java面試被提及,本文我們就來詳細聊一聊JDBC中的PreparedStatement

那么PreparedStatement是什么呢?PreparedStatement是java.sql包下面的一個接口,用來執行SQL語句查詢,通過調用connection.preparedStatement(sql)方法可以獲得PreparedStatment對象。數據庫系統會對SQL語句進行預編譯處理(如果JDBC驅動支持的話),預處理語句將被預先編譯好,這條預編譯的sql查詢語句能在將來的查詢中重用,這樣一來,它比Statement對象生成的查詢速度更快。下面是一個例子:

public class PreparedStmtExample {

?public static void main(String args[]) throws SQLException

?{

??????Connection conn = DriverManager.getConnection("mysql:\\localhost:1520",

??????"root","root");

??????PreparedStatement preStatement = conn.prepareStatement("select distinct ??????loan_type from loan where bank=?");

??????preStatement.setString(1, "Citibank");

??????ResultSet result = preStatement.executeQuery();

??????while(result.next())

??????{

??????????System.out.println("Loan Type: " + result.getString("loan_type"));

??????} ??????

????}}

Output:

Loan Type: Personal Loan

Loan Type: Auto Loan

Loan Type: Home Loan

Loan Type: Gold Loan

這個例子中,如果還是用 PreparedStatement 做同樣的查詢,哪怕參數值不一樣,比如:”Standard Chated” 或者”HSBC”作為參數值,數據庫系統還是會去調用之前編譯器編譯好的執行語句(系統庫系統初次會對查詢語句做最大的性能優化)。默認會返回”TYPE_FORWARD_ONLY”類型的結果集( ResultSet ),當然你也可以使用preparedstatment()的重載方法返回不同類型的結果集。
使用 PreparedStatement 最重要的一點好處是它擁有更佳的性能優勢,SQL語句會預編譯在數據庫系統中。執行計劃同樣會被緩存起來,它允許數據庫做參數化查詢。使用預處理語句比普通的查詢更快,因為它做的工作更少(數據庫對SQL語句的分析,編譯,優化已經在第一次查詢前完成了)。為了減少數據庫的負載,生產環境中德JDBC代碼你應該總是使用PreparedStatement 。值得注意的一點是:為了獲得性能上的優勢,應該使用參數化sql查詢而不是字符串追加的方式。

比起凌亂的字符串追加似的查詢,PreparedStatement查詢可讀性更好、更安全。

PreparedStatement的局限性

盡管PreparedStatement非常實用,但是它仍有一定的限制。了防止SQL注入攻擊,PreparedStatement不允許一個占位符(?)有多個值,在執行有**IN**子句查詢的時候這個問題變得棘手起來。

關于PreparedStatement接口,需要重點記住的是:

1. PreparedStatement可以寫參數化查詢,比Statement能獲得更好的性能。

2. 對于PreparedStatement來說,數據庫可以使用已經編譯過及定義好的執行計劃,這種預處理語句查詢比普通的查詢運行速度更快。

3. PreparedStatement可以阻止常見的SQL注入式攻擊。

4. PreparedStatement可以寫動態查詢語句

5. PreparedStatement與java.sql.Connection對象是關聯的,一旦你關閉了connection,PreparedStatement也沒法使用了。

6. “?” 叫做占位符。

7. PreparedStatement查詢默認返回FORWARD_ONLY的ResultSet,你只能往一個方向移動結果集的游標。當然你還可以設定為其他類型的值如:”CONCUR_READ_ONLY”。

8. 不支持預編譯SQL查詢的JDBC驅動,在調用connection.prepareStatement(sql)的時候,它不會把SQL查詢語句發送給數據庫做預處理,而是等到執行查詢動作的時候(調用executeQuery()方法時)才把查詢語句發送個數據庫,這種情況和使用Statement是一樣的。

9. 占位符的索引位置從1開始而不是0,如果填入0會導致*java.sql.SQLException invalid column index*異常。所以如果PreparedStatement有兩個占位符,那么第一個參數的索引時1,第二個參數的索引是2.

以上就是關于JDBC中的PreparedStatement的詳細介紹,當然由于篇幅限制我們沒有給出實際的代碼示例,在本站的JDBC教程中有很多很好的代碼實例,想要探究學習的小伙伴可以去下載學習,提高自己對JDBC的實際應用能力。

 

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产福利影院在线观看 | 国内精品久久影院 | 亚洲精品久久久久福利网站 | 玖玖色视频| 一级欧美毛片成人免费视频 | 亚洲精品国产综合99久久一区 | 久久免费精品国产视频 | 高清在线不卡 | 国产福利一区二区精品视频 | 免费看a毛片 | 亚洲精品老司机综合影院 | 国产亚洲第一 | 四虎影视884a精品国产四虎 | 亚洲综合春色另类久久 | 久久国产偷 | 一级a美女毛片 | 国产高清在线精品 | 极品专区高清在线 | 毛片不卡一区二区三区 | 国产一级影视 | www国产精品| 欧美ucjizz免费播放器 | 亚洲最大网 | 日日干天天射 | 99国产福利视频区 | 中日韩欧美在线观看 | 婷婷欧美 | 久青草国产在视频在线观看 | 久久我们这里只有精品国产4 | 亚洲欧美另类在线观看 | 亚洲欧美日韩中文字幕在线一 | 人人干在线观看 | 久久香蕉精品成人 | 最近中文国语字幕在线播放视频 | 久久精品视频网 | 欧美成人午夜免费完成 | 亚洲h片| 国产亚洲一区二区三区在线 | 婷婷综合在线观看丁香 | 五月开心婷婷 | 亚洲韩国日本一级二级r级 亚洲韩精品欧美一区二区三区 |