友情提示:此篇文章大約需要閱讀 6分鐘 41秒,不足之處請多指教,感謝你的閱讀。 訂閱本站
預處理
預處理是 mysql 為了防止客戶端頻繁請求的一種技術,是對相同處理語句進行預先加載在 mysql 中,將操作變量數(shù)據(jù)用占位符來代替,減少對 mysql 的頻繁請求,使得服務器高效運行。
在這里客戶端并不是前臺后臺之間的 c/s 架構,而是后臺程序對數(shù)據(jù)庫服務器進行操作的 c/s 架構,這樣就可以簡要地理解了后臺程序作為 client 向 mysql server 請求并處理結果了。
相關學習推薦:go語言教程
普通 sql 執(zhí)行處理過程:
在客戶端準備 sql 語句;發(fā)送 sql 語句到 mysql 服務器;在 mysql 服務器執(zhí)行該 sql 語句;服務器將執(zhí)行結果返回給客戶端。
預處理執(zhí)行處理過程:
將 sql 拆分為結構部分與數(shù)據(jù)部分;在執(zhí)行 sql 語句的時候,首先將前面相同的命令和結構部分發(fā)送給 mysql 服務器,讓 mysql 服務器事先進行一次預處理(此時并沒有真正的執(zhí)行 sql 語句);為了保證 sql 語句的結構完整性,在第一次發(fā)送 sql 語句的時候將其中可變的數(shù)據(jù)部分都用一個數(shù)據(jù)占位符來表示;然后把數(shù)據(jù)部分發(fā)送給 mysql 服務端,mysql 服務端對 sql 語句進行占位符替換;mysql 服務端執(zhí)行完整的 sql 語句并將結果返回給客戶端。預處理優(yōu)點預處理語句大大減少了分析時間,只做了一次查詢(雖然語句多次執(zhí)行);綁定參數(shù)減少了服務器帶寬,只需發(fā)送查詢的參數(shù),而不是整個語句;預處理語句針對 sql 注入是非常有用的,因為參數(shù)值發(fā)送后使用不同的協(xié)議,保證了數(shù)據(jù)的合法性。go 語言實現(xiàn)
在 go 語言中,使用 db.prepare() 方法實現(xiàn)預處理:
func (db *db) prepare(query string) (*stmt, error)prepare 執(zhí)行預處理 sql 語句,并返回 stmt 結構體指針,進行數(shù)據(jù)綁定操作。
查詢操作使用 db.prepare() 方法聲明預處理 sql,使用 stmt.query() 將數(shù)據(jù)替換占位符進行查詢,更新、插入、刪除操作使用 stmt.exec() 來操作。
預處理查詢示例
// 預處理查詢數(shù)據(jù)func preparequery() { sqlstr := "select id,name,age from user where id > ?" stmt, err := db.prepare(sqlstr) if err != nil { fmt.printf("prepare sql failed, err:%v\\\\n", err) return } rows, err := stmt.query(1) if err != nil { fmt.printf("exec failed, err:%v\\\\n", err) return } defer rows.close() for rows.next() { var u user err := rows.scan(&u.id, &u.name, &u.age) if err != nil { fmt.printf("scan data failed, err:%v\\\\n", err) return } fmt.printf("id:%d, name:%s, age:%d\\\\n", u.id, u.name, u.age) }}預處理更新示例
// 預處理更新數(shù)據(jù)func prepareupdate() { sqlstr := "update user set age = ? where id = ?" stmt, err := db.prepare(sqlstr) if err != nil { fmt.printf("prepare sql failed, err:%v\\\\n", err) return } _, err = stmt.exec(18, 2) if err != nil { fmt.printf("exec failed, err:%v\\\\n", err) return } fmt.printf("prepare update data success")}預處理插入示例
// 預處理更新數(shù)據(jù)func prepareupdate() { sqlstr := "update user set age = ? where id = ?" stmt, err := db.prepare(sqlstr) if err != nil { fmt.printf("prepare sql failed, err:%v\\\\n", err) return } _, err = stmt.exec(18, 2) if err != nil { fmt.printf("exec failed, err:%v\\\\n", err) return } fmt.printf("prepare update data success")}預處理刪除示例
// 預處理刪除數(shù)據(jù)func preparedelete() { sqlstr := "delete from user where id = ?" stmt, err := db.prepare(sqlstr) if err != nil { fmt.printf("prepare sql failed, err:%v\\\\n", err) return } result, err := stmt.exec(3) n, err := result.rowsaffected() if err != nil { fmt.printf("delete rows failed, err:%v\\\\n", err) return } if n > 0 { fmt.printf("delete data success") } else { fmt.printf("delete data error") }
麻煩幫我看一下我備案變更有沒有提交成功了騰訊云服務器代理哪個好2020阿里云雙11拼團活動:阿里云服務器低至85元/年聯(lián)想筆記本開機緩慢并顯示Intel UNDI PXE-2.1怎么解決想在小程序上加一個表單提交的頁面杭州哪里有做網站的,該如何選擇?買虛擬主機有哪些小廠商云盤可以當作網站服務器嗎