Go語言輕量級框架-Gin與入門小案例MySQL增刪查改


Go語言輕量級框架-Gin與入門小案例MySQL增刪查改

簡單的使用一下gin框架,然后使用它完成數據庫的增刪查改

一、安裝和開始

要想使用gin必須要下載和安裝它,切換到自己的工作空間,執行go命令

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

但是因為網絡問題可能會失敗,實在不行就直接通過github下載也可以。
安裝好之后就可以直接使用了,打開ide創建一個新的項目helloGin,創建main.go

package main

import (
	"github.com/gin-gonic/gin"
	"log"
)

func main() {
	// Engin
	router := gin.Default()
	//router := gin.New()
	
	router.GET("/hello", func(context *gin.Context) {
		log.Println(">>>> hello gin start <<<<")
		context.JSON(200, gin.H{
			"code":    200,
			"success": true,
			"data" : "Hello LXR!",
		})
	})
	// 指定地址和端口號
	router.Run("127.0.0.1:8082")
}

在main函數里面首先通過調用gin.Default()函數返回的是一個Engin指針,Engin代表的是整個框架的一個實例,它包含了多路復用、中間件和配置的設置,其實就是封裝了我們需要的內容。一般創建Engin都是使用Default()或者New(),當然Default()本身內部也是調用的New()函數。
接着調用Engin的GET方法,這個方法兩個參數,一個是相對路徑,一個是多個handler,即針對用戶一個請求地址,我可以指定多個handler來處理用戶請求。但是一般情況下我們都是一個handler處理一個請求。上面的代碼里使用了一個匿名函數處理"/hello"請求。然后以JSON格式的數據響應用戶請求,這個方法有兩個參數,第一個是狀態,第二個是結果。我這里直接指定200,表示成功,或者也可以用http包的常量值http.StatusOK;gin.H其實是一個map的數據結構,然后將其轉成json格式輸出。
最后是router.Run("localhost:8082"),這個方法是指定服務的主機和端口號,不過一般直接指定端口號就行了。
下面啟動項目,並訪問"localhost:8082/hello",訪問結果如下圖所示:

二、一個簡單的gin與MySQL數據庫交互

也是基於MVC的編程思想,所以將代碼分成了controller和model還有dao主要代碼,目錄結構如下

首先需要去mysql里面創建一個數據庫,SQL文件如下

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID ',
  `username` varchar(64) NOT NULL COMMENT '用戶名稱 ',
  `age` int(11) NOT NULL COMMENT 'ID ',
  `mobile` varchar(64) NOT NULL COMMENT '手機號碼 ',
  `sex` varchar(32) DEFAULT NULL COMMENT '性別 ',
  `address` varchar(64) DEFAULT NULL COMMENT '地址 ',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表';

model里面其實數據庫表的一個類,go語言就是一個結構體

User.go

package model

type User struct {
	Username 	string	`json:"name" form:"name"`
	Age  		uint8	`json:"age" form:"age"`
	Mobile 		string	`json:"mobile" form:"mobile"`
	Sex			string	`json:"sex" form:"sex"`
	Address 	string	`json:"address" form:"address"`
	Id          uint16  `json:"id" form:"id"`
}


main函數其實相當於Java里面的controller 處理路由的,代碼如下

main.go

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/helloGin/controller"
	"net/http"
)

func main()  {

	// Engin
	router := gin.Default()

	//router := gin.New()
	router.LoadHTMLGlob("template/*")
	router.GET("/hello", hello)

	// 路由組
	user := router.Group("/user")
	{	// 請求參數在請求路徑上
		user.GET("/get/:id/:username",controller.QueryById)
		user.GET("/query",controller.QueryParam)
		user.POST("/insert",controller.InsertNewUser)
		user.GET("/form",controller.RenderForm)
		user.POST("/form/post",controller.PostForm)
		//可以自己添加其他,一個請求的路徑對應一個函數

		// ...
	}

	file := router.Group("/file")
	{
		// 跳轉上傳文件頁面
		file.GET("/view",controller.RenderView)
		// 根據表單上傳
		file.POST("/insert",controller.FormUpload)
		file.POST("/multiUpload",controller.MultiUpload)
		// base64上傳
		file.POST("/upload",controller.Base64Upload)
	}

	// 指定地址和端口號
	router.Run(":9090")
}

func hello(context *gin.Context) {
	println(">>>> hello function start <<<<")

	context.JSON(http.StatusOK,gin.H{
		"code":200,
		"success":true,
	})
}

UserController.go

package controller

import (
	"database/sql"
	"github.com/gin-gonic/gin"
	"github.com/helloGin/database"
	"github.com/helloGin/model"
	"log"
	"net/http"

)

var db *sql.DB

func init()  {
	log.Println(">>>> get database connection start <<<<")
	db = database.GetDataBase()
}

// localhost:9090/user/query?id=2&name=hello
func QueryParam(context *gin.Context) {
	println(">>>> query user by url params action start <<<<")
	id := context.Query("id")
	name := context.Request.URL.Query().Get("name")
	var u model.User
	context.Bind(&u)
	context.ShouldBind(&u)

	println(u.Username)
	rows := db.QueryRow("select username,address,age,mobile,sex from t_user where id = ? and username = ?",id,name)
	var user model.User
	err := rows.Scan(&user.Username,&user.Address,&user.Age,&user.Mobile,&user.Sex)
	checkError(err)

	checkError(err)
	context.JSON(200,gin.H{
		"result":user,
	})

}
// localhost:9090/user/get/2/hello
func QueryById (context *gin.Context) {
	println(">>>> get user by id and name action start <<<<")

	// 獲取請求參數
	id := context.Param("id")
	name := context.Param("username")

	// 查詢數據庫
	rows := db.QueryRow("select username,address,age,mobile,sex from t_user where id = ? and username = ?",id,name)

	var user model.User
	//var username string
	//var address string
	//var age uint8
	//var mobile string
	//var sex string
	err := rows.Scan(&user.Username,&user.Address,&user.Age,&user.Mobile,&user.Sex)
	checkError(err)

	checkError(err)
	context.JSON(200,gin.H{
		"result":user,
	})
}

// json格式數據
func InsertNewUser (context *gin.Context) {
	println(">>>> insert controller action start <<<<")
	var user model.User

	// 使用ioutile讀取二進制數據
	//bytes,err := ioutil.ReadAll(context.Request.Body)
	//if err != nil {
	//	log.Fatal(err)
	//}
	//err = json.Unmarshal(bytes,&user)

	// 直接將結構體和提交的json參數作綁定
	err := context.ShouldBindJSON(&user)

	// 寫入數據庫
	res,err := db.Exec("insert into t_user (username,sex,address,mobile,age) values (?,?,?,?,?)",
		&user.Username,&user.Sex,&user.Address,&user.Mobile,&user.Age)
	var count int64
	count,err = res.RowsAffected()
	checkError(err)
	if count != 1 {
		context.JSON(200,gin.H{
			"success":false,
		})
	} else {
		context.JSON(200,gin.H{
			"success":true,
		})
	}

}

// form表單提交
func PostForm(context *gin.Context) {
	println(">>>> bind form post params action start <<<<")
	var u model.User

	// 綁定參數到結構體
	context.Bind(&u)
	context.ShouldBind(&u)
	res,err := db.Exec("insert into t_user (username,sex,address,mobile,age) values (?,?,?,?,?)",
		&u.Username,&u.Sex,&u.Address,&u.Mobile,&u.Age)
	var count int64
	count,err = res.RowsAffected()
	checkError(err)

	if count != 1 {
		context.JSON(200,gin.H{
			"success":false,
		})
	} else {
		//context.JSON(200,gin.H{
		//	"success":true,
		//})

		// 重定向
		context.Redirect(http.StatusMovedPermanently,"/file/view")
	}

}

// 跳轉html
func RenderForm(context *gin.Context) {
	println(">>>> render to html action start <<<<")

	context.Header("Content-Type", "text/html; charset=utf-8")
	context.HTML(200,"insertUser.html",gin.H{})
}

func checkError(e error) {
	if e != nil {
		log.Fatal(e)
	}
}

MySQL的配置文件代碼如下

connectDB.go

package database

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"strings"
)

//數據庫的基礎信息
const (
	userName = "root"
	password = "xxw2020"
	ip = "127.0.0.1"
	port = "3306"
	dbName = "student"
)

func GetDataBase() *sql.DB {

	//mysql 數據庫
	//構建連接:"用戶名:密碼@tcp(IP:端口)/數據庫?charset=utf8"
	path := strings.Join([]string{userName, ":", password, "@tcp(",ip, ":", port, ")/", dbName, "?charset=utf8"}, "")
	fmt.Println(path)
	//打開數據庫,前者是驅動名,所以要導入: _ "github.com/go-sql-driver/mysql"
	DB, _ := sql.Open("mysql", path)
	if DB == nil {
		log.Fatal("連接失敗!")
		return nil
	}
	//設置數據庫最大連接數
	DB.SetConnMaxLifetime(10)
	//設置上數據庫最大閑置連接數
	DB.SetMaxIdleConns(5)
	//驗證連接
	if err := DB.Ping(); err != nil{
		log.Fatal("opon database fail")
		return nil
	}
	return DB
}

主要的代碼已經上傳到github

首先這個需要在gopath目錄下的src/github.com/目錄下clone該代碼,然后運行數據庫建表,最后執行就ok了

參考博客golang輕量級框架-Gin入門


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM