Go操作MySQL
MySQL预处理
什么是预处理?
普通SQL语句执行过程:
- 客户端对SQL语句进行占位符替换得到完整的SQL语句。
- 客户端发送完整SQL语句到MySQL服务端
- MySQL服务端执行完整的SQL语句并将结果返回给客户端。
预处理执行过程:
- 把SQL语句分成两部分,命令部分与数据部分。
- 先把命令部分发送给MySQL服务端,MySQL服务端进行SQL预处理。
- 然后把数据部分发送给MySQL服务端,MySQL服务端对SQL语句进行占位符替换。
- MySQL服务端执行完整的SQL语句并将结果返回给客户端。
为什么要预处理?
- 优化MySQL服务器重复执行SQL的方法,可以提升服务器性能,提前让服务器编译,一次编译多次执行,节省后续编译的成本。
- 避免SQL注入问题。
Go实现MySQL预处理
database/sql
中使用下面的Prepare
方法来实现预处理操作。
func (db *DB) Prepare(query string) (*Stmt, error)
Prepare
方法会先将sql语句发送给MySQL服务端,返回一个准备好的状态用于之后的查询和命令。返回值可以同时执行多个查询和命令。
// MySQL 预处理演示(插入语句)
func prepareInsert() {
// 编写 需预处理批量的处理的语句
sqlStr := "insert into user(name,age) values(?,?)"
stmt, err := db.Prepare(sqlStr)
if err != nil {
fmt.Printf("prepare Insert Rows failed , err : %s\n", err)
return
}
// 记住一定要释放
defer stmt.Close()
// 自定义数据进行插入
var m = map[string]int{
"Charles": 21,
"Mark": 34,
"Vincent": 56,
"Jseph": 62,
}
for key, value := range m {
stmt.Exec(key, value)
}
}
上课笔记
- 第一步:编写处理批量的处理的语句
sqlStr := "insert into user(name,age) values(?,?)"
- 第二步:调用
Prepare
处理sqlStr
,注意返回的stmt
记得要关闭defer stmt.Close()
- 第三部:直接调用预处理后的语句直接传参即可
stmt.Exec(key, value)