学习Go 语言操作 MySQL 之 预处理

发布时间:2024-03-17 点击:135
友情提示:此篇文章大约需要阅读 6分钟 41秒,不足之处请多指教,感谢你的阅读。 订阅本站
预处理
预处理是 mysql 为了防止客户端频繁请求的一种技术,是对相同处理语句进行预先加载在 mysql 中,将操作变量数据用占位符来代替,减少对 mysql 的频繁请求,使得服务器高效运行。
在这里客户端并不是前台后台之间的 c/s 架构,而是后台程序对数据库服务器进行操作的 c/s 架构,这样就可以简要地理解了后台程序作为 client 向 mysql server 请求并处理结果了。
相关学习推荐:go语言教程
普通 sql 执行处理过程:
在客户端准备 sql 语句;发送 sql 语句到 mysql 服务器;在 mysql 服务器执行该 sql 语句;服务器将执行结果返回给客户端。
预处理执行处理过程:
将 sql 拆分为结构部分与数据部分;在执行 sql 语句的时候,首先将前面相同的命令和结构部分发送给 mysql 服务器,让 mysql 服务器事先进行一次预处理(此时并没有真正的执行 sql 语句);为了保证 sql 语句的结构完整性,在第一次发送 sql 语句的时候将其中可变的数据部分都用一个数据占位符来表示;然后把数据部分发送给 mysql 服务端,mysql 服务端对 sql 语句进行占位符替换;mysql 服务端执行完整的 sql 语句并将结果返回给客户端。预处理优点预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行);绑定参数减少了服务器带宽,只需发送查询的参数,而不是整个语句;预处理语句针对 sql 注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。go 语言实现
在 go 语言中,使用 db.prepare() 方法实现预处理:
func (db *db) prepare(query string) (*stmt, error)prepare 执行预处理 sql 语句,并返回 stmt 结构体指针,进行数据绑定操作。
查询操作使用 db.prepare() 方法声明预处理 sql,使用 stmt.query() 将数据替换占位符进行查询,更新、插入、删除操作使用 stmt.exec() 来操作。
预处理查询示例
// 预处理查询数据func preparequery() { sqlstr := "select id,name,age from user where id > ?" stmt, err := db.prepare(sqlstr) if err != nil { fmt.printf("prepare sql failed, err:%v\\\\n", err) return } rows, err := stmt.query(1) if err != nil { fmt.printf("exec failed, err:%v\\\\n", err) return } defer rows.close() for rows.next() { var u user err := rows.scan(&u.id, &u.name, &u.age) if err != nil { fmt.printf("scan data failed, err:%v\\\\n", err) return } fmt.printf("id:%d, name:%s, age:%d\\\\n", u.id, u.name, u.age) }}预处理更新示例
// 预处理更新数据func prepareupdate() { sqlstr := "update user set age = ? where id = ?" stmt, err := db.prepare(sqlstr) if err != nil { fmt.printf("prepare sql failed, err:%v\\\\n", err) return } _, err = stmt.exec(18, 2) if err != nil { fmt.printf("exec failed, err:%v\\\\n", err) return } fmt.printf("prepare update data success")}预处理插入示例
// 预处理更新数据func prepareupdate() { sqlstr := "update user set age = ? where id = ?" stmt, err := db.prepare(sqlstr) if err != nil { fmt.printf("prepare sql failed, err:%v\\\\n", err) return } _, err = stmt.exec(18, 2) if err != nil { fmt.printf("exec failed, err:%v\\\\n", err) return } fmt.printf("prepare update data success")}预处理删除示例
// 预处理删除数据func preparedelete() { sqlstr := "delete from user where id = ?" stmt, err := db.prepare(sqlstr) if err != nil { fmt.printf("prepare sql failed, err:%v\\\\n", err) return } result, err := stmt.exec(3) n, err := result.rowsaffected() if err != nil { fmt.printf("delete rows failed, err:%v\\\\n", err) return } if n > 0 { fmt.printf("delete data success") } else { fmt.printf("delete data error") }

麻烦帮我看一下我备案变更有没有提交成功了
腾讯云服务器代理哪个好
2020阿里云双11拼团活动:阿里云服务器低至85元/年
联想笔记本开机缓慢并显示Intel UNDI PXE-2.1怎么解决
想在小程序上加一个表单提交的页面
杭州哪里有做网站的,该如何选择?
买虚拟主机有哪些小厂商
云盘可以当作网站服务器吗