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了