GO web 数据库预处理的实现
作者:小魔童哪吒 时间:2024-01-21 04:39:07
目录
什么是预处理?
那么预处理有啥好处?
Go实现 MySQL 的事务
sqlx使用
gin + mysql + rest full api
上一篇文章我们进行了数据操作,都是使用占位符的方式来操作的
咱们其实可以使用 mysql 预处理的方式来操作这些
那么我们一起来看看什么是已处理呢?
什么是预处理?
了解什么是预处理,我们可以来对比一下,普通的 sql 语句执行过程和 预处理的执行过程
普通 sql 语句执行过程:
客户端对 SQL 语句进行 占位符 替换得到完整的 sql 语句
客户端发送完整 sql 语句到 mysql 服务端
mysql 服务端执行完整的 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)
}
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;
上图是实践过程中产生的数据
包装对数据库的增删改查操作
写路由的操作
来源:https://juejin.cn/post/7022442887514177544


猜你喜欢
javascript实现tab响应式切换特效
javascript自动生成包含数字与字符的随机字符串
python利用proxybroker构建爬虫免费IP代理池的实现

Python 实现12306登录功能实例代码
mysql的case when字段为空,null的问题
ASP.NET教程第二讲 ASP.NET学习
MySQL 5.7.13 源码编译安装配置方法图文教程

实现像php一样方便的go ORM数据库操作示例详解
python3 tkinter实现添加图片和文本

python线程信号量semaphore使用解析
Python实现线性插值和三次样条插值的示例代码

Python异步编程之协程任务的调度操作实例分析
Pytorch实现ResNet网络之Residual Block残差块
Golang 处理浮点数遇到的精度问题(使用decimal)

在ORACLE移动数据库文件
oracle 存储过程加密的方法
asp中使用js的encodeURIComponent
windows8.1下Apache+Php+MySQL配置步骤
js中如何对url进行编码和解码
再谈Python中的字符串与字符编码(推荐)
