社区精选|GO web 开发 实战三,数据库预处理
什么是预处理?
客户端对 SQL 语句进行 占位符 替换得到完整的 sql 语句 客户端发送完整 sql 语句到 mysql 服务端 mysql 服务端执行完整的 sql 语句并将结果返回给客户端
把 sql 语句分成两部
命令部分 数据部分
先把命令部分发送给 mysql 服务端,mysql 服务端进行 sql 预处理 然后把数据部分发送给 mysql 服务端, mysql 服务端对 sql 语句进行占位符替换 mysql 服务端执行完整的 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 ,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
导入 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;

包装对数据库的增删改查操作 写路由的操作
欢迎点赞,关注,收藏


关注公众号:拾黑(shiheibook)了解更多
赞助链接:
关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
- Supabase开源的后端解决方案
- 听泉鉴宝App上架App Store合法吗!苹果:专业审核 符合标准
- 韩元汇率对人民币2023年11月16日
- 澳元兑换人民币汇率2023年7月24日
- 小鹏汽车换血多位核心高管,波及两名联创;西湖大学实验室发现首个“光阴极”量子材料
- Meta Q2财报:营收首次下滑,Metaverse将与苹果竞争
- 手机得了“弹窗癌”?实测千元档安卓机,怒揭背后真相!
- 不止有P50系列,华为Mate 50系列也不会停更
- 全球自动驾驶第一股诞生之后,资本的风吹向哪?
- 小丑竟是我自己?盘点电脑机箱反人类设计
- VIP被弹专属广告?爱奇艺还有更神奇的操作
- 学霸君和优胜倒下了,在线教育虚火能烧多久?