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