三、PreparedStatement对象(重点)
一、PreparedStatement 特點:
PreparedStatement 接口繼承Statement 接口
PreparedStatement 效率高于Statement
PreparedStatement 支持動態(tài)綁定參數(shù)
PreparedStatement 具備SQL 語句預(yù)編譯能力
使用PreparedStatement 可防止出現(xiàn)SQL 注入問題
二、PreparedStatement的預(yù)編譯能力
2.1什么是預(yù)編譯
2.1.1SQL 語句的執(zhí)行步驟
語法和語義解析
優(yōu)化sql 語句,制定執(zhí)行計劃
執(zhí)行并返回結(jié)果
但是很多情況,我們的一條sql 語句可能會反復(fù)執(zhí)行,或者每次執(zhí)行的時候只有個別的值不同(比如select 的where 子句值不同,update 的set 子句值不同,insert 的values 值不同)。如果每次都需要經(jīng)
過上面的詞法語義解析、語句優(yōu)化、制定執(zhí)行計劃等,則效率就明顯不行了。
所謂預(yù)編譯語句就是將這類語句中的值用占位符替代,可以視為將sql 語句模板化或者說參數(shù)化。
預(yù)編譯語句的優(yōu)勢在于:一次編譯、多次運行,省去了解析優(yōu)化等過程;此外預(yù)編譯語句能防止sql 注入
2.1.2 解析過程
(1)硬解析
在不開啟緩存執(zhí)行計劃的情況下,每次SQL 的處理都要經(jīng)過:語法和語義的解析,優(yōu)化器處理SQL,生成執(zhí)行計劃。整個過程我們稱之為硬解析。
(2) 軟解析
如果開啟了緩存執(zhí)行計劃,數(shù)據(jù)庫在處理sql 時會先查詢緩存中是否含有與當(dāng)前SQL語句相同的執(zhí)行計劃,如果有則直接執(zhí)行該計劃。
三、預(yù)編譯方式
開始數(shù)據(jù)庫的日志:
show VARIABLES like '%general_log%'
set GLOBAL general_log = on
set GLOBAL log_output='table'
3.1 依賴數(shù)據(jù)庫驅(qū)動完成預(yù)編譯
如果我們沒有開啟數(shù)據(jù)庫服務(wù)端編譯,那么默認的是使用數(shù)據(jù)庫驅(qū)動完成SQL 的預(yù)編譯處理。
3.2 依賴數(shù)據(jù)庫服務(wù)器完成預(yù)編譯
我們可以通過修改連接數(shù)據(jù)庫的URL 信息,添加useServerPrepStmts=true 信息開啟服務(wù)端預(yù)編譯。
總結(jié)
以上是生活随笔為你收集整理的三、PreparedStatement对象(重点)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go语言变量声明、匿名变量
- 下一篇: go语言的特别之处