gin中簡單的curd接口例子

package main

import (
   "database/sql"
   "fmt"
   "strconv"
   "github.com/gin-gonic/gin"
   "net/http"
   _ "github.com/jinzhu/gorm/dialects/sqlite"
   _"github.com/go-sql-driver/mysql"
   "log"
)
var db *sql.DB
var err error
//數據表爲user,字段分別有id,name,gender,age
type User struct {
   ID int `json:"id"`
   Name string `json:"name"`
   Gender int `json:"gender"`
   Age int `json:"age"`
}
func main() {
   //初始化數據庫連接池,連接信息(數據庫類型mysql,數據庫用戶名root,數據庫密碼爲空,數據庫ip:127.0.0.1,端口3306,數據庫名imooc)
   db,err=sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/imooc?parseTime=true")
   if err != nil{
      log.Fatalln(err)
   }
   //定義數據庫操作
   defer db.Close()
   //設置數據庫空閒連接
   db.SetMaxIdleConns(20)
   //設置數據庫最大打開連接
   db.SetMaxOpenConns(20)
   if err := db.Ping(); err != nil{
      log.Fatalln(err)
   }
   //設置路由
   router := gin.Default()
   //添加
   router.POST("/user", func(c *gin.Context) {
      //接值
      Name:=c.Request.FormValue("name")
      Gender:=c.Request.FormValue("gender")
      Age:=c.Request.FormValue("age")
      //執行插入數據操作
      rs,err:=db.Exec("insert into user (name,gender,age)values (?,?,?)",Name,Gender,Age)
      if err!=nil{
         log.Fatalln(err)
      }
      id,err:=rs.LastInsertId()
      if err!=nil{
         log.Fatalln(err)
      }
      msg:=fmt.Sprintf("insert successful %d",id)
      //最後返回json格式數據
      c.JSON(http.StatusOK,gin.H{
         "msg":msg,
         "code":200,
      })
   })
   //查詢列表
   router.GET("/users", func(c *gin.Context) {
       name:=c.Request.FormValue("name")
      //執行查詢操作           rows,err:=db.Query("select * from user where name like CONCAT('%',?,'%')",name)      if err!=nil{
         log.Fatalln(err)
      }
      //定義rows.Close操作,將數據庫連接轉移到rows對象上
      defer rows.Close()
      //使用make創建一個[]User切片,而不是直接使用var users []User的聲明方式.(因爲使用make當數組切片沒有元素時,json會返回[].而直接聲明方式的話,當沒有元素時,json會返回null)
      users:=make([]User,0)
      //使用rows對象Next()方法遍歷數據
      for rows.Next(){
         //定義一個user對象
         var user User
         //一個個綁定到user對象上
         rows.Scan(&user.ID,&user.Name,&user.Gender,&user.Age)
         //最後append追加到users切片
         users=append(users,user)
      }
      if err=rows.Err();err!=nil{
         log.Fatalln(err)
      }
      //返回json格式數據
      c.JSON(http.StatusOK,gin.H{
         "users":users,
      })
   })
   //查詢單條記錄
   router.GET("/user", func(c *gin.Context) {
      //接值
      id:=c.Request.FormValue("id")
      //定義user對象
      var user User
      //執行查詢操作,並用Scan()方法將查詢結果綁定到user對象上
      err:=db.QueryRow("select * from user where id=?",id).Scan(&user.ID,&user.Name,&user.Gender,&user.Age)
      if err!=nil{
         log.Println(err)
         c.JSON(http.StatusOK,gin.H{
            "user":nil,
         })
         return
      }
      //返回json數據
      c.JSON(http.StatusOK,gin.H{
         "user":user,
      })
   })
   //修改單條記錄
   router.PUT("/update", func(c *gin.Context) {
      //接值
      cid:=c.Request.FormValue("id")
      id,_:=strconv.Atoi(cid)//將字符串類型轉換成int操作,int轉字符串: Itoa()
      name:=c.Request.FormValue("name")
      cgender:=c.Request.FormValue("gender")
      gender,_:=strconv.Atoi(cgender)
      cage:=c.Request.FormValue("age")
      age,_:=strconv.Atoi(cage)
      //創建user對象
      user:=User{ID: id,Name:name,Gender:gender,Age:age}
      //執行修改操作
      rs,err:=db.Exec("update user set name=?,gender=?,age=? where id=?",user.Name,user.Gender,user.Age,user.ID)
      if err!=nil{
         log.Fatalln(err)
      }
      //獲取修改的結果(正常情況下ra返回1)
      ra,err:=rs.RowsAffected()
      if err!=nil{
         log.Fatalln(err)
      }
      //返回的msg內容
      msg:=fmt.Sprintf("update user %d successful %d",user.ID,ra)
      //返回json數據
      c.JSON(http.StatusOK,gin.H{
         "msg":msg,
      })
   })
   //刪除某條記錄
   router.DELETE("delete", func(c *gin.Context) {
      //接值
      cid:=c.Request.FormValue("id")
      //利用strconv函數的Atoi()方法將字符串類型cid轉換爲int整型
      id,err:=strconv.Atoi(cid)
      if err!=nil{
         log.Fatalln(err)
      }
      //執行刪除操作
      rs,err:=db.Exec("delete from user where id=?",id)
      if err!=nil{
         log.Fatalln(err)
      }
      ra,err:=rs.RowsAffected()
      if err!=nil{
         log.Fatalln(err)
      }
      //返回提示信息msg
      msg:=fmt.Sprint("delete user %d successful %d",ra,id)
      //返回json數據
      c.JSON(http.StatusOK,gin.H{
         "msg":msg,
      })
   })
   //本地監聽8080端口運行該程序
   router.Run("0.0.0.0:8080")
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章