最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ù)的增刪改查操作
  •  寫(xiě)路由的操作

到此這篇關(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)文章

  • 探究gRPC?客戶端調(diào)用服務(wù)端需要連接池嗎?

    探究gRPC?客戶端調(diào)用服務(wù)端需要連接池嗎?

    這篇文章主要為大家介紹了gRPC?客戶端調(diào)用服務(wù)端需要連接池嗎的問(wèn)題探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 使用Go module和GoLand初始化一個(gè)Go項(xiàng)目的方法

    使用Go module和GoLand初始化一個(gè)Go項(xiàng)目的方法

    這篇文章主要介紹了使用Go module和GoLand初始化一個(gè)Go項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù)

    Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù)

    HTTP協(xié)議是基于TCP/IP協(xié)議棧的,并且它也是一個(gè)面向普通文本的協(xié)議。這篇文章主要詳細(xì)介紹了Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù),感興趣的小伙伴可以借鑒一下
    2023-04-04
  • go同步原語(yǔ)Phaser和Barrier區(qū)別

    go同步原語(yǔ)Phaser和Barrier區(qū)別

    這篇文章主要為大家介紹了通過(guò)java講解go同步原語(yǔ)Phaser和Barrier區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go切片的具體使用

    Go切片的具體使用

    本文主要介紹了Go切片的具體使用,包括聲明切片、初始化切片、切片的切割、切片的添加、切片的刪除、切片的復(fù)制、切片的遍歷、多維切片等,感興趣的可以了解一下
    2023-11-11
  • go語(yǔ)言阻塞函數(shù)和非阻塞函數(shù)實(shí)現(xiàn)

    go語(yǔ)言阻塞函數(shù)和非阻塞函數(shù)實(shí)現(xiàn)

    本文主要介紹了go語(yǔ)言阻塞函數(shù)和非阻塞函數(shù)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Golang 數(shù)據(jù)庫(kù)操作(sqlx)和不定字段結(jié)果查詢

    Golang 數(shù)據(jù)庫(kù)操作(sqlx)和不定字段結(jié)果查詢

    本文主要介紹了Golang 數(shù)據(jù)庫(kù)操作(sqlx)和不定字段結(jié)果查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Go 切片導(dǎo)致內(nèi)存泄露的幾種原因

    Go 切片導(dǎo)致內(nèi)存泄露的幾種原因

    某些情況下,對(duì)一個(gè)已存在的切片或數(shù)組進(jìn)行切分操作可能會(huì)導(dǎo)致內(nèi)存泄漏,本文主要介紹了Go 切片導(dǎo)致內(nèi)存泄露的幾種原因,感興趣的可以了解一下
    2023-05-05
  • Go語(yǔ)言中實(shí)現(xiàn)打印堆棧的errors包的用法詳解

    Go語(yǔ)言中實(shí)現(xiàn)打印堆棧的errors包的用法詳解

    因?yàn)镚o語(yǔ)言提供的錯(cuò)誤太簡(jiǎn)單了,以至于簡(jiǎn)單的我們無(wú)法更好的處理問(wèn)題,所以誕生了很多對(duì)錯(cuò)誤處理的庫(kù),github.com/pkg/errors是比較簡(jiǎn)潔的一樣,本文就來(lái)聊聊它的具體用法吧
    2023-07-07
  • GO語(yǔ)言支付寶沙箱對(duì)接的實(shí)現(xiàn)

    GO語(yǔ)言支付寶沙箱對(duì)接的實(shí)現(xiàn)

    本文介紹了如何使用GO語(yǔ)言對(duì)接支付寶沙箱環(huán)境,包括秘鑰生成、SDK安裝和代碼實(shí)現(xiàn)等步驟,詳細(xì)內(nèi)容涵蓋了從秘鑰生成到前端代碼的每個(gè)階段,為開(kāi)發(fā)者提供了一條清晰的指引
    2024-09-09

最新評(píng)論

齐齐哈尔市| 绍兴县| 积石山| 钟祥市| 夏河县| 鹿邑县| 思南县| 凤城市| 辰溪县| 韩城市| 新晃| 巴林右旗| 香格里拉县| 商洛市| 钟山县| 金昌市| 桂林市| 衡山县| 新兴县| 九江市| 常熟市| 蒲城县| 昌乐县| 台安县| 石渠县| 巴塘县| 香港 | 沁阳市| 米脂县| 华容县| 静安区| 陇川县| 建德市| 衡南县| 三明市| 芜湖县| 东乡| 桦川县| 兴仁县| 登封市| 柳江县|