Go使用Gin+mysql实现增删改查的详细实例

2022-12-04 22:08:25
目录
0.前置知识1.架构2.功能模块3.实现流程4.代码5.结果总结 

0.前置知识

    Go中的struct。mysql、Gin框架。Web基础。

    1.架构

    使用mysql作为数据库,Gin作为Web框架。

    2.功能模块

    1.自定义Person结构体

    2.实现对Person的增删改查。

      根据id查询或查询所有插入修改删除

      3.实现流程

      1.建立数据库连接池db,然后连接指定的数据库。

      2.编写Web接口(增删改查)

      3.通过postman测试或者直接网页请求测试。

      4.代码

      package main
      
      // 导入模块
      import (
      	"bytes"
      	"database/sql"
      	"fmt"
      	"github.com/gin-gonic/gin"
      	_ "github.com/go-sql-driver/mysql"
      	"log"
      	"net/http"
      	"strconv"
      )
      
      
      var db *sql.DB
      
      // Person 自定义Person类
      type Person struct {
      	Id        int    `json:"id"`
      	FirstName string `json:"first_name" form:"first_name"`
      	LastName  string `json:"last_name" form:"last_name"`
      }
      
      func (p *Person) get(db *sql.DB) (person Person, err error) {
      	row := db.QueryRow("SELECT id,first_name,last_name from person where id=?", p.Id)
      	err = row.Scan(&person.Id, &person.FirstName, &person.LastName)
      	if err != nil {
      		return
      	}
      	return
      }
      
      func (p *Person) getAll(db *sql.DB) (persons []Person, err error) {
      	rows, err := db.Query("select id,first_name,last_name from person")
      	fmt.Println(rows)
      	if err != nil {
      		return
      	}
      	for rows.Next() {
      		var person Person
      		rows.Scan(&person.Id, &person.FirstName, &person.LastName)
      		persons = append(persons, person)
      	}
      	defer rows.Close()
      	return
      }
      
      func (p *Person) add(db *sql.DB) (Id int, err error) {
      	stmt, err := db.Prepare("INSERT into person(first_name,last_name) values (?,?)")
      	if err != nil {
      		return
      	}
      	rs, err := stmt.Exec(p.FirstName, p.LastName)
      	if err != nil {
      		return
      	}
      	id, err := rs.LastInsertId()
      	if err != nil {
      		log.Fatalln(err)
      	}
      	Id = int(id)
      	defer stmt.Close()
      	return
      }
      
      func (p *Person) update(db *sql.DB) (rows int, err error) {
      	stmt, err := db.Prepare("update person set first_name=?,last_name=? where id=?")
      	if err != nil {
      		log.Fatalln(err)
      	}
      	rs, err := stmt.Exec(p.FirstName, p.LastName, p.Id)
      	if err != nil {
      		log.Fatalln(err)
      	}
      	row, err := rs.RowsAffected()
      	if err != nil {
      		log.Fatalln(err)
      	}
      	rows = int(row)
      	defer stmt.Close()
      	return
      }
      
      func (p *Person) del(db *sql.DB) (rows int, err error) {
      	stmt, err := db.Prepare("delete from person where id=?")
      	if err != nil {
      		log.Fatalln(err)
      	}
      	rs, err := stmt.Exec(p.Id)
      	if err != nil {
      		log.Fatalln(err)
      	}
      	row, err := rs.RowsAffected()
      	if err != nil {
      		log.Fatalln(err)
      	}
      	rows = int(row)
      	defer stmt.Close()
      	return
      }
      
      func test(db *sql.DB) {
      	rows, err := db.Query("select * from person")
      	if err != nil {
      		return
      	}
      	defer rows.Close()
      	var persons []Person
      	for rows.Next() {
      		var person Person
      		rows.Scan(&person.Id, &person.FirstName, &person.LastName)
      		persons = append(persons, person)
      	}
      	fmt.Println(persons)
      }
      func main() {
      	var err error
      	db, err := sql.Open("mysql", "root:xxxxx@tcp(127.0.0.1:3306)/go_project01?parseTime=true")
      	if err != nil {
      		log.Fatal(err.Error())
      	}
      	//defer db.Close()
      	err = db.Ping()
      	if err != nil {
      		log.Fatal(err.Error())
      	}
      	//test(db)
      	//创建路由引擎
      	router := gin.Default()
      
      	//查询,返回所有对象和对象个数
      	router.GET("/persons", func(context *gin.Context) {
      		p := Person{}
      		persons, err := p.getAll(db)
      		if err != nil {
      			log.Fatalln(err)
      		}
      		context.JSON(http.StatusOK, gin.H{
      			"result": persons,
      			"count":  len(persons),
      		})
      	})
      	//根据id查询
      	router.GET("/person/:id", func(context *gin.Context) {
      		var result gin.H
      		id := context.Param("id")
      
      		Id, err := strconv.Atoi(id)
      		if err != nil {
      			log.Fatalln(err)
      		}
      		p := Person{
      			Id: Id,
      		}
      		person, err := p.get(db)
      		if err != nil {
      			result = gin.H{
      				"result": nil,
      				"count":  0,
      			}
      		} else {
      			result = gin.H{
      				"result": person,
      				"count":  1,
      			}
      		}
      		context.JSON(http.StatusOK, result)
      	})
      	//创建person
      	router.POST("/person", func(context *gin.Context) {
      		var p Person
      		err := context.Bind(&p)
      		if err != nil {
      			log.Fatalln(err)
      		}
      
      		Id, err := p.add(db)
      		if err != nil {
      			log.Fatalln(err)
      		}
      		fmt.Println(Id)
      		name := p.FirstName + " " + p.LastName
      		context.JSON(http.StatusOK, gin.H{
      			"message": fmt.Sprintf(" %s 成功创建", name),
      		})
      	})
      	//更新update
      	router.PUT("/person/:id", func(context *gin.Context) {
      		var (
      			p      Person
      			buffer bytes.Buffer
      		)
      
      		id := context.Param("id")
      		Id, err := strconv.Atoi(id)
      		if err != nil {
      			log.Fatalln(err)
      		}
      		err = context.Bind(&p)
      		if err != nil {
      			log.Fatalln(err)
      		}
      		p.Id = Id
      		rows, err := p.update(db)
      		if err != nil {
      			log.Fatalln(err)
      		}
      		fmt.Println(rows)
      		buffer.WriteString(p.FirstName)
      		buffer.WriteString(" ")
      		buffer.WriteString(p.LastName)
      		name := buffer.String()
      
      		context.JSON(http.StatusOK, gin.H{
      			"message": fmt.Sprintf("成功更新到%s", name),
      		})
      	})
      	//删除person
      	router.DELETE("/person/:id", func(context *gin.Context) {
      		id := context.Param("id")
      
      		Id, err := strconv.ParseInt(id, 10, 10)
      		if err != nil {
      			log.Fatalln(err)
      		}
      		p := Person{Id: int(Id)}
      		rows, err := p.del(db)
      		if err != nil {
      			log.Fatalln(err)
      		}
      		fmt.Println("delete rows: ", rows)
      
      		context.JSON(http.StatusOK, gin.H{
      			"message": fmt.Sprintf("成功删除用户:%s", id),
      		})
      	})
      	router.Run(":8080")
      }

      5.结果

      总结 

      到此这篇关于Go使用Gin+mysql实现增删改查的文章就介绍到这了,更多相关Go>