“这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
前言
在go的web项目中,gin相当于java中的springmvc、gorm相当于java中的mybatis、gomod相当于java中的maven。
下面让我们来开发一个简单的web项目,根据id查询数据。
1.创建项目,用于项目管理go mod
新建一个文件夹demo,在vscode中打开,输入go mod init demo
2.创建server.go,用于MVC gin
主要点
(1)main
(2)导入gin
(3)使用gin,default、get、run
package main
import (
"gopkg.in/gin-gonic/gin.v1"
)
func main(){
r := gin.Default()
r.GET("/test",func(c *gin.Context) {
c.JSON(200,gin.H{
"msg":"hello",
})
})
r.Run()
}
3.创建三层结构
repository
db.go
主要点
(1)导入gorm和driver/mysql
(2)定义db
(3)连接数据库
package repository
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
func Init() error{
var err error
dsn := "root:1234@tcp(127.0.0.1:3306)/it?charset=utf8mb4&parseTime=True&loc=Local"
db,err = gorm.Open(mysql.Open(dsn),&gorm.Config{})
return err
}
user.go
主要点
(1)导入sync
(2)定义user结构体
(3)设置对应数据表user
(4)设置接口UserDao
(5)定义变量userDao和userOnce(单例)
(6)设置接口方法NewUserDaoInstance
(7)设置QueryUserById方法,用到db.where().find()
package repository
import (
"sync"
"gorm.io/gorm"
)
type User struct{
Uid int64 `gorm:"column:uid"`
UserName string `gorm:"column:username"`
PassWord string `gorm:"column:password"` //大写
Email string `json:"email"` //json后小写
}
func (User) TableName() string {
return "user"
}
type UserDao struct{
}
var userDao *UserDao
var userOnce sync.Once
func NewUserDaoInstance() *UserDao{
userOnce.Do(
func() {
userDao = &UserDao{}
})
return userDao
}
func (*UserDao) FindAllUser() (*User,error){
var user User
db.Find(&user)
return &user,nil
}
func (*UserDao) QueryUserById(uid int64) (*User, error) {
var user User
err := db.Where("uid = ?", uid).Find(&user).Error
if err == gorm.ErrRecordNotFound {
return nil, nil
}
if err != nil {
return nil, err
}
return &user, nil
}
service
user_service.go
暂无业务
handler
user_controller.go
主要点
(1)导入strconv
(2)定义统一返回类PageData
(3)设置FindUserById方法
(4)调用repository的QueryUserById方法
(5)返回类型为PageData
package handler
import (
"demo2/repository"
"strconv"
)
type PageData struct {
Code int64
Msg string
Data interface{}
}
func FindUserById(topicIdStr string) *PageData {
topicId, err := strconv.ParseInt(topicIdStr, 10, 64)
if err != nil {
return &PageData{
Code: -1,
Msg: err.Error(),
}
}
pageInfo, err := repository.NewUserDaoInstance().QueryUserById(topicId)
if err != nil {
return &PageData{
Code: -1,
Msg: err.Error(),
}
}
return &PageData{
Code: 0,
Msg: "success",
Data: pageInfo,
}
}
4.定义接口server.go
主要点
(1)使用repository的init方法
(2)处理init的错误
(3)定义接口/get/:id
(4)调用handler的QueryUserById方法
package main
import (
"demo2/handler"
"demo2/repository"
"os"
"gopkg.in/gin-gonic/gin.v1"
)
func main(){
if err := Init(); err != nil {
os.Exit(-1)
}
r := gin.Default()
r.GET("/test",func(c *gin.Context) {
c.JSON(200,gin.H{
"msg":"hello",
})
})
r.GET("/get/:id", func(c *gin.Context) {
topicId := c.Param("id")
data := handler.FindUserById(topicId)
c.JSON(200, data)
})
r.Run()
}
func Init() error {
if err := repository.Init(); err != nil {
return err
}
return nil
}
项目结构图
5.运行项目
结语
本文实现了根据id查询,还可以完善查找全部、添加数据、修改数据、删除数据。