上一篇文章我们进行了数据操作,都是使用占位符的方式来操作的
咱们其实可以使用 mysql 预处理的方式来操作这些
那么我们一起来看看什么是已处理呢?
了解什么是预处理,我们可以来对比一下,普通的 sql 语句执行过程和 预处理的执行过程
普通 sql 语句执行过程:
预处理执行过程:
把 sql 语句分成两部
先把命令部分发送给 mysql 服务端,mysql 服务端进行 sql 预处理
然后把数据部分发送给 mysql 服务端, mysql 服务端对 sql 语句进行占位符替换
mysql 服务端执行完整的 sql 语句并将结果返回给客户端
通过步骤和流程,我们大概知道预处理肯定比普通的 sql 执行快
优化 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)
}
开启事务处理,会有回滚机制,全部成功了,且提交成功,才算事务处理成功
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
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()
}
当然 之前说到的 http 包里面的方法实现,我们也不需要用它了,咱们也可以交给框架,真的是可以做到高效实现业务,但同时,自己下来还是要去对具体的实现原理多研究研究
实践如下步骤:
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;

上图是实践过程中产生的数据
到此这篇关于GO web 数据库预处理的实现的文章就介绍到这了,更多相关Go语言 数据库预处理内容请搜索完美下载以前的文章或继续浏览下面的相关文章希望大家以后多多支持完美下载!