Statement和PreparedStatement之間的區別

mysql預編譯:

(不瞭解預編譯可以閱讀:https://www.cnblogs.com/micrari/p/7112781.html

在解釋Statement與PreparedStatement之前,有必要來了解下mysql的預編譯:

通常我們的一條sql在db接收到最終執行完畢返回可以分爲下面三個過程:

  1. 詞法和語義解析
  2. 優化sql語句,制定執行計劃
  3. 執行並返回結果

而MySQL執行預編譯分爲如三步:

1.執行預編譯語句,例如:

prepare showUsersByLikeName from 'select * from user where username like ?';

2.設置變量,例如:

set @username='%小明%';

3.執行語句,例如:

execute showUsersByLikeName using @username;

在PreparedStatement中開啓預編譯功能

MySQL數據庫服務器的預編譯功能在4.1之後才支持預編譯功能,JDBC MySQL驅動5.0.5以後的版本默認PreparedStatement是關閉預編譯功能的,所以需要我們手動開啓。

jdbc:mysql://localhost:3306/mybatis?&useServerPrepStmts=true

如果數據庫服務器不支持預編譯功能時,並且使用PreparedStatement開啓預編譯功能是會拋出異常的。PreparedStatement的預編譯是數據庫進行的,編譯後的函數key是緩存在PreparedStatement中的,編譯後的函數緩存在數據庫服務器中,每次使用PreparedStatement對象後都要關閉該PreparedStatement對象流,否則預編譯後的函數key是不會緩存的。

一般用的PreparedStatement並沒有用到預編譯功能的,只是用到了防止sql注入攻擊的功能。防止sql注入攻擊的實現是在PreparedStatement中實現的,和服務器無關。

Statement執行sql語句是否會對編譯後的函數進行緩存

這個不好說,對於每個數據庫的具體實現都是不一樣的,對於預編譯肯定都大體相同,但是對於Statement和普通sql,數據庫一般都是先檢查sql語句是否正確,然後編譯sql語句成爲函數,最後執行函數。其實也不乏某些數據庫很瘋狂,對於普通sql的函數進行緩存。但是目前的主流數據庫都不會對sql函數進行緩存的。因爲sql語句變化那麼多,如果對所有函數緩存,那麼對於內存的消耗也是非常巨大的。

如果你不確定普通sql語句的函數是否被存儲,那要怎麼做呢?

查看MySQL日誌記錄:檢查第二次執行相同sql語句時,是否是直接通過execute來進行查詢的。

Statement 和 PreparedStatement之間的關係和區別.

關係:PreparedStatement繼承自Statement,都是接口
區別:

PreparedStatement可以使用佔位符,是預編譯的,批處理比Statement效率高 。

執行的sql語句格式不同。

ParperStatement提高了代碼的靈活性和執行效率。

ParperStatement更加安全。

參考文章:

https://blog.csdn.net/Marvel__Dead/article/details/69486947#commentBox

https://blog.csdn.net/u010442302/article/details/52558029

https://blog.csdn.net/u011161786/article/details/48394751#commentBox

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章