gin-mysql

知识要点:对 MySQL 的 crud 操作

  • MySql 的初始化和释放连接
  • 查询
    • 单个查询
    • 多个查询
    • 模糊查询
  • 新增
    • 单个新增
    • 多个新增
  • 更新
    • 单个更新
    • 多个更新
  • 删除
    • 单个删除
    • 多个删除

Code:

package main

import (
	"database/sql"
	"fmt"
	"log"
	"net/http"
	"strconv"

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

//定义User类型结构
type User struct {
	Id       int    `json:"id"`
	Username string `json:"username"`
	Password string `json:"password"`
}

func initDB() *sql.DB {
	db, _ := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
	return db
}

//定义一个getALL函数用于回去全部的信息
func getAll() (users []User, err error) {

	//1.操作数据库
	db := initDB()
	//错误检查
	if err != nil {
		log.Fatal(err.Error())
	}
	//推迟数据库连接的关闭
	defer db.Close()

	//2.查询
	rows, err := db.Query("SELECT id, username, password FROM user_info")
	if err != nil {
		log.Fatal(err.Error())
	}

	for rows.Next() {
		var user User
		//遍历表中所有行的信息
		rows.Scan(&user.Id, &user.Username, &user.Password)
		//将user添加到users中
		users = append(users, user)
	}
	//最后关闭连接
	defer rows.Close()
	return
}

//插入数据
func add(user User) (Id int, err error) {

	//1.操作数据库
	db := initDB()
	//错误检查
	if err != nil {
		log.Fatal(err.Error())
	}
	//推迟数据库连接的关闭
	defer db.Close()
	stmt, err := db.Prepare("INSERT INTO user_info(username, password) VALUES (?, ?)")
	if err != nil {
		return
	}
	//执行插入操作
	rs, err := stmt.Exec(user.Username, user.Password)
	if err != nil {
		return
	}
	//返回插入的id
	id, err := rs.LastInsertId()
	if err != nil {
		log.Fatalln(err)
	}
	//将id类型转换
	Id = int(id)
	defer stmt.Close()
	return
}

//修改数据
func update(user User) (rowsAffected int64, err error) {

	//1.操作数据库
	db := initDB()
	//错误检查
	if err != nil {
		log.Fatal(err.Error())
	}
	//推迟数据库连接的关闭,确保 db 不为 Nil
	defer db.Close()
	stmt, err := db.Prepare("UPDATE  user_info SET username=?, password=? WHERE id=?")
	if err != nil {
		return
	}
	//执行修改操作
	rs, err := stmt.Exec(user.Username, user.Password, user.Id)
	if err != nil {
		return
	}
	//返回插入的id
	rowsAffected, err = rs.RowsAffected()
	if err != nil {
		log.Fatalln(err)
	}
	defer stmt.Close()
	return
}

//通过id删除
func del(id int) (rows int, err error) {
	// 1.操作数据库
	db := initDB()
	//错误检查
	if err != nil {
		log.Fatal(err.Error())
	}
	//推迟数据库连接的关闭
	defer db.Close()
	stmt, err := db.Prepare("DELETE FROM user_info WHERE id=?")
	if err != nil {
		log.Fatalln(err)
	}

	rs, err := stmt.Exec(id)
	if err != nil {
		log.Fatalln(err)
	}
	//删除的行数
	row, err := rs.RowsAffected()
	if err != nil {
		log.Fatalln(err)
	}
	defer stmt.Close()
	rows = int(row)
	return
}

func main() {
	//创建一个路由Handler
	router := gin.Default()

	//get方法的查询
	router.GET("/user", func(c *gin.Context) {
		users, err := getAll()
		if err != nil {
			log.Fatal(err)
		}
		//H is a shortcut for map[string]interface{}
		c.JSON(http.StatusOK, gin.H{
			"result": users,
			"count":  len(users),
		})
	})

	router.POST("/add", func(c *gin.Context) {
		var u User
		err := c.Bind(&u)
		if err != nil {
			log.Fatal(err)
		}
		Id, err := add(u)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Print("id=", Id)
		fmt.Println("===========================================")
		c.JSON(http.StatusOK, gin.H{
			"message": fmt.Sprintf("%s 插入成功, id 为 %d", u.Username, Id),
		})
	})

	// 利用put方法修改数据
	router.PUT("/update", func(c *gin.Context) {
		var u User
		err := c.Bind(&u)
		if err != nil {
			log.Fatal(err)
		}
		num, _ := update(u)
		fmt.Print("num=", num)
		c.JSON(http.StatusOK, gin.H{
			"message": fmt.Sprintf("修改id: %d 成功", u.Id),
		})
	})

	//利用DELETE请求方法通过id删除
	router.DELETE("/delete/:id", func(c *gin.Context) {
		id := c.Param("id")

		Id, err := strconv.Atoi(id)

		if err != nil {
			log.Fatalln(err)
		}
		rows, err := del(Id)
		if err != nil {
			log.Fatalln(err)
		}
		fmt.Println("delete rows ", rows)

		c.JSON(http.StatusOK, gin.H{
			"message": fmt.Sprintf("Successfully deleted user: %s", id),
		})
	})

	router.Run(":8080")
}

测试:

@base = 127.0.0.1:8080

### 
GET http://{{base}}/user HTTP/1.1


###
POST http://{{base}}/add HTTP/1.1
Content-Type: application/json

{
  "username": "Delete test",
  "password": "test"
}

###
PUT http://{{base}}/update HTTP/1.1
Content-Type: application/json

{
  "id": 1,
  "username": "Tony",
  "password": "3333333"
}
###
DELETE http://{{base}}/delete/3 HTTP/1.1