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

Go語言Gin框架中使用MySQL數(shù)據(jù)庫的三種方式

 更新時間:2023年11月07日 09:54:16   作者:浮塵筆記  
本文主要介紹了Go語言Gin框架中使用MySQL數(shù)據(jù)庫的三種方式,通過三種方式實現(xiàn)增刪改查的操作,具有一定的參考價值,感興趣的可以了解一下

本文演示在Gin框架中通過三種方式實現(xiàn)增刪改查的操作,數(shù)據(jù)表結(jié)構(gòu)如下:

CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `user_no` bigint(20) unsigned NOT NULL COMMENT '用戶編號',
  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '用戶姓名',
  `age` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '用戶年齡',
  `address` varchar(255) NOT NULL DEFAULT '' COMMENT '地址',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加時間',
  `update_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`),
  UNIQUE KEY `key_user_no` (`user_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

原生SQL操作

在Gin框架中使用MySQL的最簡單的方式就是直接處理SQL語句,記得引入 _ "github.com/go-sql-driver/mysql"。

代碼如下:

//公共方法封裝
package dbUtil

import (
	"database/sql"
	"fmt"
	"github.com/gin-gonic/gin"
	_ "github.com/go-sql-driver/mysql"
	"net/http"
	"strconv"
)

var tableName = "users" //數(shù)據(jù)表名
var result ResponseData //響應結(jié)果數(shù)據(jù)

// 統(tǒng)一返回數(shù)據(jù)的結(jié)構(gòu)體
type ResponseData struct {
	Code    int         `json:"code"`
	Message string      `json:"message"`
	Data    interface{} `json:"data"`
}

func showSuccess(c *gin.Context, data interface{}) {
	result.Code = http.StatusOK
	result.Message = "操作成功"
	result.Data = data
	c.JSON(http.StatusOK, result)
	return
}

func showError(c *gin.Context, message string) {
	result.Code = http.StatusBadRequest
	result.Message = message
	result.Data = nil
	c.JSON(http.StatusOK, result)
	return
}

// 使用原生SQL語句
// go-sql-driver地址:https://github.com/go-sql-driver/mysql
var sqlDb *sql.DB //數(shù)據(jù)庫連接db

// 初始化
func init() {
	//打開數(shù)據(jù)庫
	//parseTime:時間格式轉(zhuǎn)換(查詢結(jié)果為時間時,是否自動解析為時間);
	//loc=Local:MySQL的時區(qū)設置
	sqlStr := "root:rx123456@tcp(127.0.0.1:3306)/gin_demo?charset=utf8&parseTime=true&loc=Local"
	var err error
	sqlDb, err = sql.Open("mysql", sqlStr)
	if err != nil {
		fmt.Println("數(shù)據(jù)庫打開失?。?, err)
		return
	}

	//測試與數(shù)據(jù)庫建立的連接,非必要(校驗連接是否正確)
	err = sqlDb.Ping()
	if err != nil {
		fmt.Println("數(shù)據(jù)庫連接失?。?, err)
		return
	}
}

// 用戶結(jié)構(gòu)體
type sqlUserData struct {
	Id      int    `json:"id"`
	UserNo  int    `json:"user_no"`
	Name    string `json:"name"`
	Age     int    `json:"age"`
	Address string `json:"address"`
	Remarks string `json:"remarks"`
}

func MysqlInsertData(c *gin.Context) {
	/*
		//請求參數(shù)
		{
			"user_no":1001,
			"name":"張三",
			"age":18,
			"address":"北京昌平"
		}
	*/
	var user sqlUserData
	err := c.Bind(&user)
	if err != nil {
		showError(c, fmt.Sprint(err))
		return
	}
	sqlStr := "insert into " + tableName + "(user_no, name, age, address) values (?,?,?,?)"
	ret, err := sqlDb.Exec(sqlStr, user.UserNo, user.Name, user.Age, user.Address)
	if err != nil {
		fmt.Printf("insert failed, err:%v\n", err)
		showError(c, fmt.Sprint(err))
		return
	}
	newDataId, _ := ret.LastInsertId()
	showSuccess(c, "新增的結(jié)果id:"+strconv.Itoa(int(newDataId)))
}

func MysqlGetUserList(c *gin.Context) {
	name := c.Query("name")
	sqlStr := "select id,user_no,name,age,address from " + tableName + " where name=?"
	rows, err := sqlDb.Query(sqlStr, name)
	if err != nil {
		showError(c, fmt.Sprint(err))
		return
	}
	defer rows.Close()
	userList := make([]sqlUserData, 0)
	for rows.Next() {
		var user sqlUserData
		rows.Scan(&user.Id, &user.UserNo, &user.Name, &user.Age, &user.Address)
		if user.Age >= 18 {
			user.Remarks = "已成年"
		} else {
			user.Remarks = "未成年"
		}
		userList = append(userList, user)
	}
	showSuccess(c, userList)
}

func MysqlGetUserInfo(c *gin.Context) {
	id := c.Query("id")
	sqlStr := "select id,user_no,name,age,address from " + tableName + " where id=?"
	var user sqlUserData
	err := sqlDb.QueryRow(sqlStr, id).Scan(&user.Id, &user.UserNo, &user.Name, &user.Age, &user.Address)
	if err != nil {
		showError(c, fmt.Sprint(err))
		return
	}
	showSuccess(c, user)
}

func MysqlUpdateData(c *gin.Context) {
	/*
		//請求參數(shù)
		{
		    "id":1,
		    "age":13,
		    "address":"河北"
		}
	*/
	var user sqlUserData
	err := c.Bind(&user)
	if err != nil {
		showError(c, fmt.Sprint(err))
		return
	}
	sqlStr := "update " + tableName + " set age=? ,address=? where id=?"
	ret, err := sqlDb.Exec(sqlStr, user.Age, user.Address, user.Id)
	if err != nil {
		fmt.Printf("update failed, err:%v\n", err)
		showError(c, fmt.Sprint(err))
		return
	}
	res, _ := ret.RowsAffected()
	showSuccess(c, "受影響的行數(shù):"+strconv.Itoa(int(res)))
}

func MysqlDeleteData(c *gin.Context) {
	id := c.Query("id")
	var count int
	//先查詢
	sqlStr := "select count(*) from " + tableName + " where id=?"
	err := sqlDb.QueryRow(sqlStr, id).Scan(&count)
	if count <= 0 || err != nil {
		showError(c, "數(shù)據(jù)不存在")
		return
	}

	//再刪除
	delStr := "delete from " + tableName + " where id=?"
	ret, err := sqlDb.Exec(delStr, id)
	if err != nil {
		fmt.Printf("delete failed, err:%v\n", err)
		showError(c, fmt.Sprint(err))
		return
	}
	res, _ := ret.RowsAffected()
	showSuccess(c, "受影響的行數(shù):"+strconv.Itoa(int(res)))
}

XORM

xorm是一個Go語言的ORM庫,通過它可以很方便的操作數(shù)據(jù)庫。它的設計重點是高性能和易用性。XORM支持多種數(shù)據(jù)庫,包括MySQL、PostgreSQL、SQLite、Oracle和SQL Server,并提供了豐富的查詢語言。XORM還支持事務和緩存機制,可以提高數(shù)據(jù)庫操作的性能。添加依賴:go get github.com/go-xorm/xorm

ORM,即pobject-RelationlMapping,它的作用是在關(guān)系型數(shù)據(jù)庫和對象之間作一個映射,這樣我們在具體操作數(shù)據(jù)庫的時候,就不需要再去和復雜的SQL語句打交道,只要像平時操作對象一樣操作它就可以了。
比較好的Go語言ORM包括:xorm與gorm

下面是代碼實現(xiàn):

package dbUtil

import (
	"fmt"
	"github.com/gin-gonic/gin"
	_ "github.com/go-sql-driver/mysql"
	"github.com/go-xorm/xorm"
	"strconv"
	"time"
)

var myXorm *xorm.Engine

// 定義結(jié)構(gòu)體(xorm支持雙向映射);如果表不存在,則會自動創(chuàng)建
type users struct {
	Id         int64     `xorm:"pk autoincr" json:"id"` //指定主鍵并自增
	UserNo     int       `xorm:"unique" json:"user_no"`
	Name       string    `json:"name"`
	Age        int       `json:"age"`
	Address    string    `json:"address"`
	CreateTime time.Time `xorm:"created" json:"create_time"`
	UpdateTime time.Time `xorm:"updated" json:"update_time"`
}

func init() {
	sqlStr := "root:rx123456@tcp(127.0.0.1:3306)/gin_demo?charset=utf8&parseTime=true&loc=Local"
	var err error

	//創(chuàng)建數(shù)據(jù)庫引擎
	myXorm, err = xorm.NewEngine("mysql", sqlStr)
	if err != nil {
		fmt.Println("數(shù)據(jù)庫連接失敗:", err)
	}

	//創(chuàng)建或者同步表,表名稱是users
	//如果數(shù)據(jù)表不存在,會根據(jù)users結(jié)構(gòu)體自動創(chuàng)建
	err = myXorm.Sync(new(users))
	if err != nil {
		fmt.Println("數(shù)據(jù)表同步失敗:", err)
	}
}

func XormGetUserList(c *gin.Context) {
	name := c.Query("name")
	var user []users
	err := myXorm.Where("name=?", name).And("age>20").Limit(10, 0).Asc("age").Find(&user)
	if err != nil {
		showError(c, fmt.Sprint(err))
		return
	}
	showSuccess(c, user)
}

func XormGetUserInfo(c *gin.Context) {
	id := c.Query("id")
	var user []users
	err := myXorm.Where("id=?", id).Find(&user)
	if err != nil {
		showError(c, fmt.Sprint(err))
		return
	}
	if len(user) == 0 {
		showSuccess(c, nil)
	}
	showSuccess(c, user[0])
}

func XormInsertData(c *gin.Context) {
	/*
		//請求參數(shù)
		{
			"user_no":1001,
			"name":"張三",
			"age":18,
			"address":"北京昌平"
		}
	*/
	var user users
	err := c.Bind(&user)
	if err != nil {
		showError(c, fmt.Sprint(err))
		return
	}
	affected, err := myXorm.Insert(user)
	if err != nil || affected <= 0 {
		fmt.Printf("insert failed, err:%v\n", err)
		showError(c, fmt.Sprint(err))
		return
	}
	showSuccess(c, "受影響的行數(shù):"+strconv.Itoa(int(affected)))
}

func XormUpdateData(c *gin.Context) {
	/*
		//請求參數(shù)
		{
		    "id":1,
		    "age":13,
		    "address":"河北"
		}
	*/
	var u users
	err := c.Bind(&u)
	if err != nil {
		showError(c, fmt.Sprint(err))
		return
	}

	//先查找
	var user []users
	err = myXorm.Where("id=?", u.Id).Find(&user)
	//fmt.Println(myXorm.NewSession().LastSQL())
	if err != nil {
		showError(c, fmt.Sprint(err))
		return
	}
	if len(user) == 0 {
		showError(c, "數(shù)據(jù)不存在")
		return
	}

	//再修改
	affected, err := myXorm.Where("id=?", u.Id).Update(&users{
		Age:     u.Age,
		Address: u.Address,
	})
	if err != nil {
		showError(c, fmt.Sprint(err))
		return
	}
	showSuccess(c, "受影響的行數(shù):"+strconv.Itoa(int(affected)))
}

func XormDeleteData(c *gin.Context) {
	id := c.Query("id")
	//先查找
	var user []users
	err := myXorm.Where("id=?", id).Find(&user)
	if err != nil {
		showError(c, fmt.Sprint(err))
		return
	}
	if len(user) == 0 {
		showError(c, "數(shù)據(jù)不存在")
		return
	}

	//再刪除
	affected, err := myXorm.Where("id=?", id).Delete(&users{})
	if err != nil {
		showError(c, fmt.Sprint(err))
		return
	}
	showSuccess(c, "受影響的行數(shù):"+strconv.Itoa(int(affected)))
}

GORM

GORM是Go語言中最受歡迎的ORM框架之一。它具有易于使用的API和靈活的查詢語言,支持多種類型的數(shù)據(jù)庫,包括MySQL、PostgreSQL、SQLite和SQL Server。GORM還提供了自動遷移功能,可以在應用程序啟動時自動創(chuàng)建數(shù)據(jù)庫表和字段。
使用方法:添加依賴 go get gorm.io/gormgo get gorm.io/driver/mysql

實現(xiàn)代碼如下:

package dbUtil

import (
	"fmt"
	"github.com/gin-gonic/gin"
	_ "github.com/go-sql-driver/mysql"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"time"
)

var gormDB *gorm.DB

// 定義結(jié)構(gòu)體
// 特別注意:結(jié)構(gòu)體名稱為:user,創(chuàng)建的表的名稱為:users
type user struct {
	Id         int       `gorm:"primaryKey;autoIncrement" json:"id"` //指定主鍵并自增
	UserNo     int       `gorm:"unique" json:"user_no"`
	Name       string    `gorm:"type:varchar(256);not null" json:"name"`
	Age        int       `gorm:"type:tinyint(4);not null" json:"age"`
	Address    string    `gorm:"type:varchar(256);not null" json:"address"`
	CreateTime time.Time `json:"create_time"`
	UpdateTime time.Time `json:"update_time"`
}

func init() {
	var err error
	sqlStr := "root:rx123456@tcp(127.0.0.1:3306)/gin_demo?charset=utf8mb4&parseTime=true&loc=Local"
	gormDB, err = gorm.Open(mysql.Open(sqlStr), &gorm.Config{}) //配置項中預設了連接池 ConnPool
	if err != nil {
		fmt.Println("數(shù)據(jù)庫連接出錯:", err)
		return
	}
}

// 捕獲異常
func catchException(c *gin.Context) {
	err := recover()
	if err != nil {
		showError(c, fmt.Sprint(err))
	}
}

func GormGetUserList(c *gin.Context) {
	defer func() {
		catchException(c)
	}()

	name := c.Query("name")
	myUser := make([]user, 10)
	tx := gormDB.Where("name=?", name).Find(&myUser).Limit(10) //查詢到的有可能為多行,所以采用結(jié)構(gòu)體切片
	if tx.Error != nil {
		showError(c, fmt.Sprint(tx.Error))
		return
	}
	showSuccess(c, myUser)
}

func GormGetUserInfo(c *gin.Context) {
	defer func() {
		catchException(c)
	}()

	id := c.Query("id")
	myUser := user{}
	tx := gormDB.Where("id=?", id).First(&myUser)
	if tx.Error != nil {
		showError(c, fmt.Sprint(tx.Error))
		return
	}
	showSuccess(c, myUser)
}

func GormInsertData(c *gin.Context) {
	/*
		//請求參數(shù)
		{
			"user_no":1001,
			"name":"張三",
			"age":18,
			"address":"北京昌平"
		}
	*/

	defer func() {
		catchException(c)
	}()

	var myUser user
	err := c.Bind(&myUser)
	if err != nil {
		showError(c, fmt.Sprint(err))
	}
	fmt.Println("myUser", myUser)
	tx := gormDB.Create(&myUser)
	fmt.Println(tx)
	if tx.RowsAffected > 0 {
		showSuccess(c, tx.RowsAffected)
		return
	} else {
		fmt.Printf("insert failed, err:%v\n", err)
		showError(c, fmt.Sprint(tx.Error))
	}
}

func GormUpdateData(c *gin.Context) {
	/*
		//請求參數(shù)
		{
		    "id":1,
		    "age":13,
		    "address":"河北"
		}
	*/
	defer func() {
		catchException(c)
	}()

	var myUser user
	err := c.Bind(&myUser)
	if err != nil {
		showError(c, fmt.Sprint(err))
	}
	fmt.Println("myUser", myUser)

	//先查找
	var count int64
	gormDB.Model(&user{}).Where("id=?", myUser.Id).Count(&count)
	if count == 0 {
		showError(c, "數(shù)據(jù)不存在")
		return
	}
	//再更新
	tx := gormDB.Model(&user{}).Where("id=?", myUser.Id).Updates(&myUser)
	fmt.Println(tx) //打印結(jié)果
	if tx.RowsAffected > 0 {
		showSuccess(c, tx.RowsAffected)
	} else {
		showError(c, fmt.Sprint(tx.Error))
	}
}

func GormDeleteData(c *gin.Context) {
	defer func() {
		catchException(c)
	}()

	id := c.Query("id")
	//先查找
	var count int64
	gormDB.Model(&user{}).Where("id=?", id).Count(&count)
	if count == 0 {
		showError(c, "數(shù)據(jù)不存在")
		return
	}
	//再刪除
	tx := gormDB.Where("id=?", id).Delete(&user{})
	fmt.Println(tx) //打印結(jié)果
	if tx.RowsAffected > 0 {
		showSuccess(c, tx.RowsAffected)
	} else {
		showError(c, fmt.Sprint(tx.Error))
	}
}

GORM和XORM都是優(yōu)秀的ORM框架,它們之間的一些區(qū)別:

  • 查詢語言:GORM使用鏈式查詢語法,而XORM使用結(jié)構(gòu)體作為查詢條件。XORM的查詢語言更為靈活,可以支持更復雜的查詢。
  • 性能:XORM的性能比GORM更高,在大量數(shù)據(jù)的情況下,XORM能夠更快地進行數(shù)據(jù)庫操作。
  • 易用性:GORM的API比XORM更易用,特別是對于沒有ORM經(jīng)驗的開發(fā)者來說。
  • 社區(qū)支持:GORM的社區(qū)比XORM更大,因此有更多的文檔、示例和插件可以使用。

到此這篇關(guān)于Go語言Gin框架中使用MySQL數(shù)據(jù)庫的三種方式的文章就介紹到這了,更多相關(guān)Gin框架使用MySQL數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Golang開發(fā)命令行之flag包的使用方法

    Golang開發(fā)命令行之flag包的使用方法

    這篇文章主要介紹Golang開發(fā)命令行及flag包的使用方法,日常命令行操作,相對應的眾多命令行工具是提高生產(chǎn)力的必備工具,本文圍繞該內(nèi)容展開話題,需要的朋友可以參考一下
    2021-10-10
  • 通過Golang編寫一個AES加密解密工具

    通過Golang編寫一個AES加密解密工具

    這篇文章主要為大家詳細介紹了如何利用Golang制作一個AES加密解密工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-05-05
  • golang sql語句超時控制方案及原理

    golang sql語句超時控制方案及原理

    一般應用程序在執(zhí)行一條sql語句時,都會給這條sql設置一個超時時間,本文主要介紹了golang sql語句超時控制方案及原理,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • 使用gorm.Scopes函數(shù)實現(xiàn)復用查詢邏輯示例

    使用gorm.Scopes函數(shù)實現(xiàn)復用查詢邏輯示例

    這篇文章主要為大家介紹了使用gorm.Scopes函數(shù)實現(xiàn)復用查詢邏輯示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Systemd集成Golang二進制程序的方法

    Systemd集成Golang二進制程序的方法

    這篇文章主要介紹了Systemd集成Golang二進制程序的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-10-10
  • golang程序進度條實現(xiàn)示例詳解

    golang程序進度條實現(xiàn)示例詳解

    這篇文章主要為大家介紹了golang程序?qū)崿F(xiàn)進度條示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Go anko實現(xiàn)支持腳本語言

    Go anko實現(xiàn)支持腳本語言

    anko是一個可以讓 Go 項目支持腳本語言的小工具,換句話說,就是可以給 Go 項目加點“腳本魔法”,下面就跟隨小編一起來學習一下他的具體使用吧
    2024-11-11
  • golang獲取變量或?qū)ο箢愋偷膸追N方式總結(jié)

    golang獲取變量或?qū)ο箢愋偷膸追N方式總結(jié)

    在golang中并沒有提供內(nèi)置函數(shù)來獲取變量的類型,但是通過一定的方式也可以獲取,下面這篇文章主要給大家介紹了關(guān)于golang獲取變量或?qū)ο箢愋偷膸追N方式,需要的朋友可以參考下
    2022-12-12
  • GoLang sync.Pool簡介與用法

    GoLang sync.Pool簡介與用法

    這篇文章主要介紹了GoLang sync.Pool簡介與用法,Pool是可伸縮、并發(fā)安全的臨時對象池,用來存放已經(jīng)分配但暫時不用的臨時對象,通過對象重用機制,緩解GC壓力,提高程序性能
    2023-01-01
  • Go中阻塞以及非阻塞操作實現(xiàn)(Goroutine和main Goroutine)

    Go中阻塞以及非阻塞操作實現(xiàn)(Goroutine和main Goroutine)

    本文主要介紹了Go中阻塞以及非阻塞操作實現(xiàn)(Goroutine和main Goroutine),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05

最新評論