从Java到Go,如何用gin、gorm框架开发web项目 | 青训营笔记

329 阅读2分钟

“这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记

前言

在go的web项目中,gin相当于java中的springmvc、gorm相当于java中的mybatis、gomod相当于java中的maven。

下面让我们来开发一个简单的web项目,根据id查询数据。

1.创建项目,用于项目管理go mod

新建一个文件夹demo,在vscode中打开,输入go mod init demo

image.png

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()
}

image.png

image.png

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
}

项目结构图

image.png

5.运行项目

image.png

  image.png

image.png

结语

本文实现了根据id查询,还可以完善查找全部、添加数据、修改数据、删除数据。 

参考文献

gin

gorm

实例代码