MySQL?Prepared?Statement?預(yù)處理的操作方法
預(yù)處理語(yǔ)句(Prepared Statement) 是一種在數(shù)據(jù)庫(kù)管理系統(tǒng)中使用的編程概念,用于執(zhí)行對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的 SQL 語(yǔ)句。
使用預(yù)處理語(yǔ)句的具體方式和語(yǔ)法依賴(lài)于所用的編程語(yǔ)言和數(shù)據(jù)庫(kù)管理系統(tǒng)。常見(jiàn)的編程語(yǔ)言如 Java、PHP、Python 和 C# 都提供了對(duì)預(yù)處理語(yǔ)句的支持。
在MySQL版本4.1之前,查詢(xún)以文本格式發(fā)送到MySQL服務(wù)器。反過(guò)來(lái),MySQL使用 文本協(xié)議(text protocol) 將數(shù)據(jù)返回給客戶(hù)端。MySQL必須完全解析查詢(xún)并將結(jié)果集轉(zhuǎn)換為字符串,然后再將其返回給客戶(hù)端。
文本協(xié)議具有嚴(yán)重的性能影響。為解決此問(wèn)題,自4.1版本后,MySQL添加了一項(xiàng)新特性—— prepared statement
prepared statement 利用 client/server binary protocol ,它將包含占位符(?)的查詢(xún)語(yǔ)句發(fā)送到MySQL服務(wù)器:
SELECT column_list FROM products WHERE productcode = ?;
當(dāng) MySQL 使用不同的 productcode 值 執(zhí)行此查詢(xún)時(shí),它不必完全解析查詢(xún)。這有助于MySQL更快地執(zhí)行查詢(xún),提升程序的性能,特別是當(dāng)MySQL多次執(zhí)行相同的查詢(xún)時(shí)。
由于預(yù)處理語(yǔ)句使用占位符(?),這有助于避免許多SQL注入的變體,使應(yīng)用程序更安全。
預(yù)處理語(yǔ)句的基本思想是將 SQL 語(yǔ)句和參數(shù)分離開(kāi)來(lái)。在執(zhí)行之前,數(shù)據(jù)庫(kù)管理系統(tǒng)會(huì)先解析并編譯預(yù)處理語(yǔ)句,然后將其保存在預(yù)處理語(yǔ)句的執(zhí)行計(jì)劃中。
當(dāng)應(yīng)用程序需要執(zhí)行相同或類(lèi)似的 SQL 語(yǔ)句時(shí),只需要對(duì)參數(shù)進(jìn)行修改,而不必重新解析和編譯整個(gè) SQL 語(yǔ)句,從而提高執(zhí)行效率。
使用步驟
使用預(yù)處理語(yǔ)句通常需要以下幾個(gè)步驟:
- 準(zhǔn)備預(yù)處理語(yǔ)句:應(yīng)用程序先將 SQL 語(yǔ)句發(fā)送給數(shù)據(jù)庫(kù)管理系統(tǒng),并告知數(shù)據(jù)庫(kù)要使用預(yù)處理語(yǔ)句的方式進(jìn)行處理。數(shù)據(jù)庫(kù)會(huì)進(jìn)行語(yǔ)法分析和執(zhí)行計(jì)劃的生成,生成一個(gè)可執(zhí)行的預(yù)處理語(yǔ)句對(duì)象。
- 綁定參數(shù):應(yīng)用程序?qū)⒁獔?zhí)行的 SQL 語(yǔ)句中的參數(shù)值綁定到預(yù)處理語(yǔ)句中。這樣可以防止 SQL 注入攻擊,并且可以使數(shù)據(jù)庫(kù)系統(tǒng)充分利用參數(shù)值進(jìn)行查詢(xún)優(yōu)化。
- 執(zhí)行預(yù)處理語(yǔ)句:應(yīng)用程序?qū)⒔壎藚?shù)的預(yù)處理語(yǔ)句發(fā)送給數(shù)據(jù)庫(kù)進(jìn)行執(zhí)行。數(shù)據(jù)庫(kù)會(huì)根據(jù)預(yù)處理語(yǔ)句中的執(zhí)行計(jì)劃執(zhí)行相應(yīng)的操作,并返回結(jié)果給應(yīng)用程序。
用法
![![[Pasted image 20231010205950.png]]](http://img.jbzj.com/file_images/article/202408/202408030945168.png)
使用 預(yù)處理語(yǔ)句 需要如下三個(gè)語(yǔ)句:
PREPARE:為執(zhí)行準(zhǔn)備一條語(yǔ)句EXECUTE:執(zhí)行PREPARE語(yǔ)句準(zhǔn)備好的語(yǔ)句DEALLOCATE PREPARE:發(fā)布準(zhǔn)備好的聲明
-- 示例
'''step 1'''
PREPARE stmt1 FROM
'SELECT
productCode,
productName
FROM products
WHERE productCode = ?';
'''step 2
聲明一個(gè)變量 pc,代表productcode并為其賦值'''
SET @pc = 'S10_1678';
'''step 3
EXECUTE'''
EXECUTE stmt1 USING @pc;
'''step 4
為變量 pc 分配另一個(gè)product code'''
SET @pc = 'S12_1099';
'''step 5
EXECUTE with the new product code'''
EXECUTE stmt1 USING @pc;
'''step 6
release the prepared statement'''
DEALLOCATE PREPARE stmt1;優(yōu)點(diǎn)
- 提高性能:預(yù)處理語(yǔ)句的執(zhí)行計(jì)劃可以被多次重復(fù)使用,避免了重復(fù)解析和編譯 SQL 語(yǔ)句的開(kāi)銷(xiāo),提高了執(zhí)行效率。
- 預(yù)防 SQL 注入攻擊:通過(guò)參數(shù)綁定,預(yù)處理語(yǔ)句可以防止惡意用戶(hù)通過(guò)輸入特殊字符來(lái)修改 SQL 邏輯,提升了應(yīng)用程序的安全性。
- 方便維護(hù):將 SQL 邏輯和參數(shù)分開(kāi),使代碼清晰易讀,易于維護(hù)和修改。
到此這篇關(guān)于MySQL Prepared Statement 預(yù)處理 的文章就介紹到這了,更多相關(guān)MySQL Prepared Statement 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL提示:The server quit without updating
今天網(wǎng)站web頁(yè)面提交內(nèi)容到數(shù)據(jù)庫(kù),發(fā)現(xiàn)出錯(cuò)了,一直提交不了,數(shù)找了下原因,發(fā)現(xiàn)數(shù)據(jù)寫(xiě)不進(jìn)去!第一反應(yīng),重啟mysql數(shù)據(jù)庫(kù),一直執(zhí)行中,停止不了也啟動(dòng)不了,直覺(jué)告訴我磁盤(pán)滿(mǎn)了 !2014-04-04
MySQL group by分組后如何將每組所得到的id拼接起來(lái)
這篇文章主要介紹了MySQL group by分組后如何將每組所得到的id拼接起來(lái),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
MySQL示例講解數(shù)據(jù)庫(kù)約束以及表的設(shè)計(jì)
約束主要完成對(duì)數(shù)據(jù)的檢驗(yàn),保證數(shù)據(jù)庫(kù)數(shù)據(jù)的完整性;如果有相互依賴(lài)數(shù)據(jù),保證該數(shù)據(jù)不被刪除,本篇文章教你如何給表設(shè)置約束及設(shè)計(jì)2022-06-06
master and slave have equal MySQL server UUIDs 解決方法
使用rsync配置了大量mysql,省去了大量編譯和配置的時(shí)間,隨逐個(gè)修改master和slave服務(wù)器的my.cnf,后,發(fā)現(xiàn)數(shù)據(jù)不能同步2013-07-07
MySQL的Redo Log數(shù)據(jù)恢復(fù)核心機(jī)制面試精講
這篇文章主要為大家介紹了MySQL的Redo Log數(shù)據(jù)恢復(fù)核心機(jī)制面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Mysql如何通過(guò)binlog日志恢復(fù)數(shù)據(jù)詳解
binlog日志用于記錄所有更新了數(shù)據(jù)或者已經(jīng)潛在更新了數(shù)據(jù)的所有語(yǔ)句,下面這篇文章主要給大家介紹了關(guān)于Mysql如何通過(guò)binlog日志恢復(fù)數(shù)據(jù)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02

