欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

GO web 數(shù)據(jù)庫(kù)預(yù)處理的實(shí)現(xiàn)

 更新時(shí)間:2021年10月25日 09:52:34   作者:小魔童哪吒  
本文主要介紹了GO web 數(shù)據(jù)庫(kù)預(yù)處理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

 上一篇文章我們進(jìn)行了數(shù)據(jù)操作,都是使用占位符的方式來(lái)操作的

咱們其實(shí)可以使用 mysql 預(yù)處理的方式來(lái)操作這些

那么我們一起來(lái)看看什么是已處理呢?

什么是預(yù)處理?

了解什么是預(yù)處理,我們可以來(lái)對(duì)比一下,普通的 sql 語(yǔ)句執(zhí)行過(guò)程和 預(yù)處理的執(zhí)行過(guò)程

普通 sql 語(yǔ)句執(zhí)行過(guò)程:

  • 客戶端對(duì) SQL 語(yǔ)句進(jìn)行 占位符 替換得到完整的 sql 語(yǔ)句
  • 客戶端發(fā)送完整 sql 語(yǔ)句到 mysql 服務(wù)端
  • mysql 服務(wù)端執(zhí)行完整的 sql 語(yǔ)句并將結(jié)果返回給客戶端

預(yù)處理執(zhí)行過(guò)程:

  • 把 sql 語(yǔ)句分成兩部
    • 命令部分
    • 數(shù)據(jù)部分
  • 先把命令部分發(fā)送給 mysql 服務(wù)端,mysql 服務(wù)端進(jìn)行 sql 預(yù)處理
  • 然后把數(shù)據(jù)部分發(fā)送給 mysql 服務(wù)端, mysql 服務(wù)端對(duì) sql 語(yǔ)句進(jìn)行占位符替換
  • mysql 服務(wù)端執(zhí)行完整的 sql 語(yǔ)句并將結(jié)果返回給客戶端

通過(guò)步驟和流程,我們大概知道預(yù)處理肯定比普通的 sql 執(zhí)行快

那么預(yù)處理有啥好處?

優(yōu)化 mysql 服務(wù)器重復(fù)執(zhí)行 sql 的方法,可以提升服務(wù)器性能,提前讓服務(wù)器編譯,一次編譯多次 執(zhí)行,節(jié)省后續(xù)編譯的成本
避免 sql 注入的問(wèn)題

//預(yù)處理 插入數(shù)據(jù)操作
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實(shí)現(xiàn) MySQL 的事務(wù)

開(kāi)啟事務(wù)處理,會(huì)有回滾機(jī)制,全部成功了,且提交成功,才算事務(wù)處理成功

  • func (db *DB) Begin() (*Tx, error) 事務(wù)開(kāi)始
  • func (tx *Tx) Commit() error 事務(wù)提交
  • func (tx *Tx) Rollback() error 事務(wù)回滾
func trasaction(db *sql.DB) {

 //開(kāi)啟一個(gè)事務(wù)

 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
 }

    //提交事務(wù)
 err = tx.Commit()
 if err != nil {
  if tx != nil {
   tx.Rollback()
  }
  fmt.Printf("Commit err :%v", err)
  return
 }

 fmt.Println("commit success ")
}

sqlx使用

咱們還可以使用第三方庫(kù) sqlx

  • 安裝第三方庫(kù) sqlx ,go get github.com/jmoiron/sqlx
  • 第三方庫(kù)可以提交高開(kāi)發(fā)效率,簡(jiǎn)化開(kāi)發(fā)操作
package main

import (
 "fmt"
 "github.com/jmoiron/sqlx"
 _ "github.com/go-sql-driver/mysql" // 注釋掉后異常 _ 調(diào)用初始化函數(shù)
)

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)

 //插入數(shù)據(jù)
 insertInfo()
}

gin + mysql + rest full api

當(dāng)然 之前說(shuō)到的 http 包里面的方法實(shí)現(xiàn),我們也不需要用它了,咱們也可以交給框架,真的是可以做到高效實(shí)現(xiàn)業(yè)務(wù),但同時(shí),自己下來(lái)還是要去對(duì)具體的實(shí)現(xiàn)原理多研究研究

實(shí)踐如下步驟:

  • 導(dǎo)入 github.com/gin-gonic/gin 庫(kù)
  • 建立 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;

 

上圖是實(shí)踐過(guò)程中產(chǎn)生的數(shù)據(jù)

  • 包裝對(duì)數(shù)據(jù)庫(kù)的增刪改查操作
  •  寫路由的操作

到此這篇關(guān)于GO web 數(shù)據(jù)庫(kù)預(yù)處理的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)GO 數(shù)據(jù)庫(kù)預(yù)處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言題解LeetCode268丟失的數(shù)字示例詳解

    Go語(yǔ)言題解LeetCode268丟失的數(shù)字示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言題解LeetCode268丟失的數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Go操作redis與redigo的示例解析

    Go操作redis與redigo的示例解析

    這篇文章主要為大家介紹了Go操作redis與redigo的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 一文帶你熟悉Go語(yǔ)言中函數(shù)的使用

    一文帶你熟悉Go語(yǔ)言中函數(shù)的使用

    這篇文章主要和大家分享一下Go語(yǔ)言中的函數(shù)的使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的小伙伴可以參考一下
    2022-11-11
  • 基于微服務(wù)框架go-micro開(kāi)發(fā)gRPC應(yīng)用程序

    基于微服務(wù)框架go-micro開(kāi)發(fā)gRPC應(yīng)用程序

    這篇文章介紹了基于微服務(wù)框架go-micro開(kāi)發(fā)gRPC應(yīng)用程序的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Go語(yǔ)言range關(guān)鍵字循環(huán)時(shí)的坑

    Go語(yǔ)言range關(guān)鍵字循環(huán)時(shí)的坑

    今天小編就為大家分享一篇關(guān)于Go語(yǔ)言range關(guān)鍵字循環(huán)時(shí)的坑,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • jenkins配置golang?代碼工程自動(dòng)發(fā)布的實(shí)現(xiàn)方法

    jenkins配置golang?代碼工程自動(dòng)發(fā)布的實(shí)現(xiàn)方法

    這篇文章主要介紹了jenkins配置golang?代碼工程自動(dòng)發(fā)布,jks是個(gè)很好的工具,使用方法也很多,我只用了它簡(jiǎn)單的功能,對(duì)jenkins配置golang相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-07-07
  • golang中beego入門

    golang中beego入門

    Beego是一個(gè)基于Go語(yǔ)言的開(kāi)源框架,用于構(gòu)建Web應(yīng)用程序和API,本文主要介紹了golang中beego入門,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 詳解Go語(yǔ)言中數(shù)組,切片和映射的使用

    詳解Go語(yǔ)言中數(shù)組,切片和映射的使用

    Arrays (數(shù)組), Slices (切片) 和 Maps (映射) 是常見(jiàn)的一類數(shù)據(jù)結(jié)構(gòu)。這篇文章將為大家詳細(xì)介紹一下Go語(yǔ)言中數(shù)組,切片和映射的使用,感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • golang中的select關(guān)鍵字用法總結(jié)

    golang中的select關(guān)鍵字用法總結(jié)

    這篇文章主要介紹了golang中的select關(guān)鍵字用法總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Golang生成Excel文檔的方法步驟

    Golang生成Excel文檔的方法步驟

    生成Excel是一個(gè)很常見(jiàn)的需求,本文將介紹如何使用Go的 Excelize庫(kù)去生成Excel文檔,以及一些具體場(chǎng)景下的代碼實(shí)現(xiàn),感興趣的可以參考一下
    2021-06-06

最新評(píng)論