咱們其實可以使用 mysql 預處理的方式來操作這些
那么我們一起來看看什么是已處理呢?
什么是預處理?
了解什么是預處理,我們可以來對比一下,普通的 sql 陳述句執行程序和 預處理的執行程序
普通 sql 陳述句執行程序:
- 客戶端對 SQL 陳述句進行 占位符 替換得到完整的 sql 陳述句
- 客戶端發送完整 sql 陳述句到 mysql 服務端
- mysql 服務端執行完整的 sql 陳述句并將結果回傳給客戶端
預處理執行程序:
-
把 sql 陳述句分成兩部
- 命令部分
- 資料部分
- 先把命令部分發送給 mysql 服務端,mysql 服務端進行 sql 預處理
- 然后把資料部分發送給 mysql 服務端, mysql 服務端對 sql 陳述句進行占位符替換
- mysql 服務端執行完整的 sql 陳述句并將結果回傳給客戶端
通過步驟和流程,我們大概知道預處理肯定比普通的 sql 執行快

薪資:底薪加績效(最高底薪50%)
???????釘釘:馬新宇 9455510168
???????Lark(海外版飛書):[email protected]
???????letstalk: t395300395
???????telegram:@youmiboss @HRdajisi
???????谷歌郵箱: [email protected]
???????Skype: live:.cid.d850fdc83f05e44a
那么預處理有啥好處?
- 優化 mysql 服務器重復執行 sql 的方法,可以提升服務器性能,提前讓服務器編譯,一次編譯多次
執行,節省后續編譯的成本 - 避免 sql 注入的問題
//預處理 插入資料操作
func prepareInfo(db *sql.DB) {
sqlInfo := "insert into user (name,age)values(?,?)"
stmt, err := db.Prepare(sqlInfo)
if err != nil {
fmt.Println("Exec err : ", err)
return
}
ret, err := stmt.Exec("花豬2", 28)
if err != nil {
fmt.Println("stmt Exec err : ", err)
return
}
ret, err = stmt.Exec("花豬3", 28)
if err != nil {
fmt.Println("stmt Exec err : ", err)
return
}
rows, err := ret.RowsAffected()
if err != nil {
fmt.Println("stmt Exec err : ", err)
return
}
fmt.Println("rows = ", rows)
}
Go實作 MySQL 的事務
- 開啟事務處理,會有回滾機制,全部成功了,且提交成功,才算事務處理成功
func (db *DB) Begin() (*Tx, error)事務開始func (tx *Tx) Commit() error事務提交-
func (tx *Tx) Rollback() error事務回滾func trasaction(db *sql.DB) { //開啟一個事務 tx, err := db.Begin() if err != nil { if tx != nil { tx.Rollback() } fmt.Printf("Begin err :%v", err) return } sqlStr := "update user set name='xxx' where id=?" _, err = tx.Exec(sqlStr, 9) if err != nil { if tx != nil { tx.Rollback() } fmt.Printf("Exec err :%v", err) return } sqlStr = "update user set name='xxx' where id=?" _, err = tx.Exec(sqlStr, 6) if err != nil { if tx != nil { tx.Rollback() } fmt.Printf("Exec err :%v", err) return } //提交事務 err = tx.Commit() if err != nil { if tx != nil { tx.Rollback() } fmt.Printf("Commit err :%v", err) return } fmt.Println("commit success ") }sqlx使用
咱們還可以使用第三方庫 sqlx
- 安裝第三方庫 sqlx ,
go get github.com/jmoiron/sqlx -
第三方庫可以提交高開發效率,簡化開發操作
package main import ( "fmt" "github.com/jmoiron/sqlx" _ "github.com/go-sql-driver/mysql" // 注釋掉后例外 _ 呼叫初始化函式 ) var db *sqlx.DB func insertInfo() { sqlStr := "insert into user(name,age)values(?,?)" res, err := db.Exec(sqlStr, "xxx", 2) if err != nil { fmt.Printf("Exec err : %v", err) return } id, err := res.LastInsertId() if err != nil { fmt.Printf("LastInsertId err : %v", err) return } fmt.Printf("id == %d", id) rows, err := res.RowsAffected() if err != nil { fmt.Printf("RowsAffected err : %v", rows) return } fmt.Printf("rows == %d", rows) return } func main() { var err error dsn := "root:123456@tcp(127.0.0.1:3306)/go_test?charset=utf8mb4" db, err = sqlx.Connect("mysql", dsn) if err != nil { fmt.Printf("Connect err : %v\n", err) return } db.SetMaxOpenConns(20) db.SetMaxIdleConns(10) //插入資料 insertInfo() }gin + mysql + rest full api
當然 之前說到的 http 包里面的方法實作,我們也不需要用它了,咱們也可以交給框架,真的是可以做到高效實作業務,但同時,自己下來還是要去對具體的實作原理多研究研究
實踐如下步驟:
- 匯入
github.com/gin-gonic/gin庫 -
建立
users表,id,name,telephone欄位CREATE TABLE `users` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `name` VARCHAR(20) DEFAULT '', `telephone` VARCHAR(20) DEFAULT '', PRIMARY KEY(`id`) )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;<img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d8827a4583814e2cb9567af33ddbd3eb~tplv-k3u1fbpfcp-zoom-1.image" style="zoom:100%;"/>
上圖是實踐程序中產生的資料
- 包裝對資料庫的增刪改查操作
- 寫路由的操作
- 安裝第三方庫 sqlx ,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544270.html
標籤:其他
上一篇:02-python簡介
下一篇:記憶體對齊
