Go Gin+MySQL实现增删改查

发布时间 2024-01-10 14:51:37作者: 飘杨......

一、概述

  使用Gin框架+MySQL数据库实现增删改查(原生sql)

  实现步骤:

    1.导入Gin框架

go get -u github.com/gin-gonic/gin

    2.引入MySQL驱动

go get -u github.com/go-sql-driver/mysql

    3.注册Gin路由

// 注册用户路由
func RegisterUser() {
    //实例化一个路由
    router := gin.Default()
    //注册增删改查路由
    router.POST("/addUser", addUserHandler)
    router.GET("/getUsers", getUsersHandler)
    router.GET("/getUserById", getUserById)
    router.POST("/updateUser/:id", updateUserHandler)
    router.POST("/deleteUser", deleteUserHandler)
    router.Run(":8888")
}

    4.实现路由方法

      以上路径后面就是路由需要实现的方法,如:addUserHandler

    5.连接数据库

// 获取数据库连接对象
func getDB(info string) *sql.DB {
    sqlConnectStr := "root:123456@tcp(localhost:3306)/tony_cursor?charset=utf8&parseTime=true&loc=Local"
    SQLDB, err := sql.Open("mysql", sqlConnectStr)
    if err != nil {
        fmt.Println("数据库打开失败", err)
        // return
    }
    //测试与数据库建立的连接
    err = SQLDB.Ping()
    if err != nil {
        fmt.Println("数据库连接失败", err)
        // return
    } else {
        fmt.Println("数据库连接成功")
    }
    // defer SQLDB.Close()
    fmt.Println(info)
    return SQLDB
}

 

二、代码示例

  1.添加用户

  SQLDB := getDB("添加用户")
    //解析请求实体中的数据
    var user User
    err1 := context.ShouldBindJSON(&user)
    fmt.Println("接收到用户请求的数据:", user)
    fmt.Println("创建时间:", user.CreateTime)
    if err1 != nil { //如果出错则返回错误信息
        context.JSON(400, gin.H{ //说明是客户端传参有问题
            "error": "Invalid request body"})
        return
    }
    fmt.Println("开始执行sql")
    //执行插入操作并执行返回结果(执行原生sql语句)
    sql := "insert into user (name,pwd,head_img,phone,create_time) values (?,?,?,?,?)"
    fmt.Println(user.Name, user.Pwd, user.Phone, user.HeadImg, user.Phone, user.CreateTime)
    _, mErr := SQLDB.Exec(sql, user.Name, user.Pwd, user.HeadImg, user.Phone, user.CreateTime)
    if mErr != nil { //说明是服务端出现异常
        context.JSON(500, gin.H{
            "error": "Failed to create user" + mErr.Error()})
        fmt.Println(mErr)
        return
    }
    fmt.Println("sql执行完成开始给客户端返回正确结果")
    //如果都没有问题则返回200
    context.JSON(200, gin.H{
        "message": "User created successfully"})

  

 

  2.获取用户列表

SQLDB := getDB("查询用户列表")
    rows, err := SQLDB.Query("select id,name,head_img,phone,create_time from user")
    if err != nil {
        context.JSON(500, gin.H{
            "error": err.Error()})
        return
    }
    defer rows.Close()

    //解析查询结果并返回json形式的用户列表
    users := []User{}
    for rows.Next() {
        var user User
        err1 := rows.Scan(&user.Id, &user.Name, &user.HeadImg, &user.Phone, &user.CreateTime)
        if err1 != nil {
            context.JSON(500, gin.H{
                "error": err1.Error()})
            return
        }
        users = append(users, user)
    }
    context.JSON(200, gin.H{
        "data": users})

   3.通过用户id获取特定用户

   SQLDB := getDB("根据用户id查询用户")
    id := context.Query("id") //这里指的是接受param中的参数
    fmt.Println("用户id:", id)
    row := SQLDB.QueryRow("select id,name,head_img,phone,create_time from user where id=?", id)
    if row.Err() != nil {
        context.JSON(500, gin.H{"error": row.Err().Error()})
        return
    }
    var user User
    err := row.Scan(&user.Id, &user.Name, &user.HeadImg, &user.Phone, &user.CreateTime)
    if err != nil {
        context.JSON(500, gin.H{"error": err.Error()})
        return
    }
    context.JSON(200, gin.H{"data": user})

   4.根据用户id修改指定用户

SQLDB := getDB("更新用户信息")
    var id string = context.Param("id") //从请求的url中获取参数(restfull)
    var user User
    err2 := context.ShouldBindJSON(&user) //接收请求参数(json格式的)
    if err2 != nil {
        context.JSON(400, gin.H{
            "error": err2.Error()})
        return
    }
    ret, err1 := SQLDB.Exec("update user set name=? where id=?", user.Name, id)
    if err1 != nil {
        context.JSON(500, gin.H{
            "error": err1.Error()})
        return
    }
    mId, err3 := ret.LastInsertId()
    if err3 != nil {
        context.JSON(500, gin.H{"error": err3.Error()})
        return
    }
    context.JSON(200, gin.H{"data": mId})

   5.根据用户id逻辑删除指定指定用户

SQLDB := getDB("删除用户信息")
    var user User
    err := context.ShouldBindJSON(&user)
    if err != nil {
        context.JSON(400, gin.H{"error": err.Error()})
        return
    }
    _, err1 := SQLDB.Exec("update user set deleted=1 where id=?", user.Id)
    if err1 != nil {
        context.JSON(500, gin.H{"error": err1.Error()})
        return
    }
    context.JSON(200, gin.H{"data": "delete user successfuly"})

  6.对用户表进行增删改查完整代码

package controller

import (
    "database/sql"
    "fmt"

    "github.com/gin-gonic/gin"
    _ "github.com/go-sql-driver/mysql"
)

// 用户实体
type User struct {
    Id         int64  `json:"id"`
    Name       string `json:"name"`
    Pwd        string `json:"pwd"`
    HeadImg    string `json:"head_img"`
    Phone      string `json:"phone"`
    CreateTime string `json:"create_time"`
    UpdateTime string `json:"update_time"`
    Sort       int    `json:"sort"`
    CreateUser int64  `json:"create_user"`
    UpdateUser int64  `json:"update_user"`
    Deleted    int    `json:"deleted"`
}

// 注册用户路由
func RegisterUser() {
    //实例化一个路由
    router := gin.Default()
    //注册增删改查路由
    router.POST("/addUser", addUserHandler)
    router.GET("/getUsers", getUsersHandler)
    router.GET("/getUserById", getUserById)
    router.POST("/updateUser/:id", updateUserHandler)
    router.POST("/deleteUser", deleteUserHandler)
    router.Run(":8888")
}

// 添加新用户
func addUserHandler(context *gin.Context) {
    SQLDB := getDB("添加用户")
    //解析请求实体中的数据
    var user User
    err1 := context.ShouldBindJSON(&user)
    fmt.Println("接收到用户请求的数据:", user)
    fmt.Println("创建时间:", user.CreateTime)
    if err1 != nil { //如果出错则返回错误信息
        context.JSON(400, gin.H{ //说明是客户端传参有问题
            "error": "Invalid request body"})
        return
    }
    fmt.Println("开始执行sql")
    //执行插入操作并执行返回结果(执行原生sql语句)
    sql := "insert into user (name,pwd,head_img,phone,create_time) values (?,?,?,?,?)"
    fmt.Println(user.Name, user.Pwd, user.Phone, user.HeadImg, user.Phone, user.CreateTime)
    _, mErr := SQLDB.Exec(sql, user.Name, user.Pwd, user.HeadImg, user.Phone, user.CreateTime)
    if mErr != nil { //说明是服务端出现异常
        context.JSON(500, gin.H{
            "error": "Failed to create user" + mErr.Error()})
        fmt.Println(mErr)
        return
    }
    fmt.Println("sql执行完成开始给客户端返回正确结果")
    //如果都没有问题则返回200
    context.JSON(200, gin.H{
        "message": "User created successfully"})
}

// 获取用户列表
func getUsersHandler(context *gin.Context) {
    SQLDB := getDB("查询用户列表")
    rows, err := SQLDB.Query("select id,name,head_img,phone,create_time from user")
    if err != nil {
        context.JSON(500, gin.H{
            "error": err.Error()})
        return
    }
    defer rows.Close()

    //解析查询结果并返回json形式的用户列表
    users := []User{}
    for rows.Next() {
        var user User
        err1 := rows.Scan(&user.Id, &user.Name, &user.HeadImg, &user.Phone, &user.CreateTime)
        if err1 != nil {
            context.JSON(500, gin.H{
                "error": err1.Error()})
            return
        }
        users = append(users, user)
    }
    context.JSON(200, gin.H{
        "data": users})
}

func getUserById(context *gin.Context) {
    SQLDB := getDB("查询用户列表")
    id := context.Query("id") //这里指的是接受param中的参数
    fmt.Println("用户id:", id)
    row := SQLDB.QueryRow("select id,name,head_img,phone,create_time from user where id=?", id)
    if row.Err() != nil {
        context.JSON(500, gin.H{"error": row.Err().Error()})
        return
    }
    var user User
    err := row.Scan(&user.Id, &user.Name, &user.HeadImg, &user.Phone, &user.CreateTime)
    if err != nil {
        context.JSON(500, gin.H{"error": err.Error()})
        return
    }
    context.JSON(200, gin.H{"data": user})

}

// 更新用户信息
func updateUserHandler(context *gin.Context) {
    SQLDB := getDB("更新用户信息")
    var id string = context.Param("id") //从请求的url中获取参数(restfull)
    var user User
    err2 := context.ShouldBindJSON(&user) //接收请求参数(json格式的)
    if err2 != nil {
        context.JSON(400, gin.H{
            "error": err2.Error()})
        return
    }
    ret, err1 := SQLDB.Exec("update user set name=? where id=?", user.Name, id)
    if err1 != nil {
        context.JSON(500, gin.H{
            "error": err1.Error()})
        return
    }
    mId, err3 := ret.LastInsertId()
    if err3 != nil {
        context.JSON(500, gin.H{"error": err3.Error()})
        return
    }
    context.JSON(200, gin.H{"data": mId})

}

// 删除用户
func deleteUserHandler(context *gin.Context) {
    SQLDB := getDB("删除用户信息")
    var user User
    err := context.ShouldBindJSON(&user)
    if err != nil {
        context.JSON(400, gin.H{"error": err.Error()})
        return
    }
    _, err1 := SQLDB.Exec("update user set deleted=1 where id=?", user.Id)
    if err1 != nil {
        context.JSON(500, gin.H{"error": err1.Error()})
        return
    }
    context.JSON(200, gin.H{"data": "delete user successfuly"})

}

// 获取数据库连接对象
func getDB(info string) *sql.DB {
    sqlConnectStr := "root:123456@tcp(localhost:3306)/tony_cursor?charset=utf8&parseTime=true&loc=Local"
    SQLDB, err := sql.Open("mysql", sqlConnectStr)
    if err != nil {
        fmt.Println("数据库打开失败", err)
        // return
    }
    //测试与数据库建立的连接
    err = SQLDB.Ping()
    if err != nil {
        fmt.Println("数据库连接失败", err)
        // return
    } else {
        fmt.Println("数据库连接成功")
    }
    // defer SQLDB.Close()
    fmt.Println(info)
    return SQLDB
}

  7.使用

// GinTest.go
package main

import (
    "fmt"

    "go_workspace/controller"
)

func main() {
    controller.RegisterUser()
    fmt.Println("Hello World!")
}

  8.完结