PreparedStatement 和 Statement 的區別

一、連接數據庫的步驟

第一種:
(1)加載驅動: Class.forName(“com.mysql.jdbc.Driver”);
(2)獲取連接:
Connection connection=DriverManager.getConnection(
“jdbc:mysql://localhost:3306/數據庫名稱?useSSL=false”,
“root”,
“數據庫密碼”);
(3)創建處理對象:
Statement statement=connection.createStatement();
(4)編寫sql語句:String sql;
(5)執行sql語句:
statement.executeQuery(sql); //查詢
starement.executeUpdate(sql); //增,刪,改
(6)關閉處理對象: statement.close();
(7)關閉連接: connection.close();


第二種:
(1)創建一個 DataSource 數據源

DataSource  dataSource = new MysqlDataSource();
MysqlDataSource tmpDataSource = (MysqlDataSource) dataSource;   
tmpDataSource.setURL("jdbc:mysql://127.0.0.1:3306/java_image_server?characterEncoding=utf8&useSSL=true");
tmpDataSource.setUser(“root");
tmpDataSource.setPassword("123");
return dataSource;

(2)獲取連接:
Connection connection=dataSource. getConnection() ;
(3)編寫sql語句:String sql;
(4)創建對象:
PreparedStatement statement=connection. prepareStatement( sql );
(5)執行sql語句:
statement.executeQuery(); //查詢
starement.executeUpdate(); //增,刪,改
(5)關閉處理對象: statement.close();
(6)關閉連接: connection.close();

二、區別

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

2.使用 Statement 還是 PreparedStatement 對象
JDBC驅動的最佳化是基於使用的是什麼功能.,選擇 PreparedStatement 還是 Statement 取決於你要怎麼使用它們.。對於只執行一次的 SQL 語句選擇Statement 是最好的. 相反, 如果 SQL 語句被多次執行選用PreparedStatement 則是最好的.

3.PreparedStatement 對象可以防止 sql 注入,而 Statement 不能防止 sql 注入。

什麼是 SQL 注入呢?
SQL 注入即是指web 應用程序對用戶輸入數據的合法性沒有判斷或過濾不嚴,攻擊者可以在web 應用程序中事先定義好的查詢語句的結尾上添加額外的SQL 語句,在管理員不知情的情況下實現非法操作,以此來實現欺騙數據庫服務器執行非授權的任意查詢,從而進一步得到相應的數據信息。

4.PreparedStatement 繼承自 Statement, 兩個都是接口
區別:PreparedStatement 可以使用佔位符,是預編譯的,批處理比Statement 效率高

5.Statement執行不帶參數的簡單SQL語句,並返回它所生成結果的對象,每次執行SQL語句時,數據庫都要編譯該sql語句。PreparedStatement用來執行帶參數的預編譯的SQL語句

三、總結

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

  1. PreparedStatement 可以寫參數化查詢,比 Statement 能獲得更好的性能。
  2. 對於 PreparedStatement 來說,數據庫可以使用已經編譯過及定義好的執行計劃,這種預處理語句查詢比普通的查詢運行速度更快。
  3. PreparedStatement 可以阻止常見的 SQL 注入式攻擊(安全性好)
  4. PreparedStatement可以寫動態查詢語句
  5. PreparedStatement 與 java.sql.Connection 對象是關聯的,一旦你關閉了connection,PreparedStatement 也沒法使用了。
  6. “?” 叫做佔位符。
  7. 佔位符的索引位置從1開始而不是0,如果填入0會導致java.sql.SQLException invalid column index 異常。
  8. 效率高:使用PreparedStatement執行SQL命令時,命令會被數據庫編譯和解析,並放到命令緩衝區.以後每當執行同一個PreparedStatement對象時,預編譯的命令就可以重複使用
  9. 代碼可讀性和可維護性好
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章