文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

GO web 数据库预处理的实现

2024-04-02 19:55

关注

 上一篇文章我们进行了数据操作,都是使用占位符的方式来操作的

咱们其实可以使用 mysql 预处理的方式来操作这些

那么我们一起来看看什么是已处理呢?

什么是预处理?

了解什么是预处理,我们可以来对比一下,普通的 sql 语句执行过程和 预处理的执行过程

普通 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 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


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 包里面的方法实现,我们也不需要用它了,咱们也可以交给框架,真的是可以做到高效实现业务,但同时,自己下来还是要去对具体的实现原理多研究研究

实践如下步骤:


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 数据库预处理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯