初学 go 入门-案例-教程-记录(16)gin + gorm 两个框架结合做一个简单的小案例(三)依赖注入+增删查改

918 阅读3分钟

初学 go 入门-案例-教程-记录(16)gin + gorm 两个框架结合做一个简单的小案例(三)依赖注入+增删查改

希望能写一些简单的教程和案例分享给需要的人
欢迎进qq群交流:546496965

我们之前接触了如何用搭建 webapi 框架 Gin blog.csdn.net/qq_36051316…

也接触了一些 使用gorm 的使用
blog.csdn.net/qq_36051316…

gin : github.com/gin-gonic/g…

目录展示

在这里插入图片描述

安装依赖

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlserver
go get -u github.com/gin-gonic/gin

完整代码

main.go

package main

import (
	"awesomeProject/until"
	"github.com/gin-gonic/gin"
)

func init() {
	//初始化
	until.SqlClient()
}

func main() {
	// 初始化路由
	router := InitRouter(gin.Default())
	// 启动:端口
	router.Run(":10001")
}

router

package main

import (
	"awesomeProject/api"
	"github.com/gin-gonic/gin"
)

/**
 * @Description: 初始化路由
 * @param engine
 * @return *gin.Engine
 */

func InitRouter(engine *gin.Engine) *gin.Engine {
	// 创建组 api
	group := engine.Group("api")
	{
		StudentRouter(group)
	}
	return engine
}

/**
 * @Description: 学生组路由
 * @param g
 */

func StudentRouter(g *gin.RouterGroup) {
	studentController := api.NewStudentController()
	// 创建学生组
	student := g.Group("student")
	{
		// 查询全部数据:路由:api函数
		student.GET("getAll", studentController.StudentGetAll)
		// 新增:路由:api函数
		student.POST("add", studentController.StudentAdd)
		// 修改:路由:api函数
		student.POST("update", studentController.StudentUpdate)
		// 删除::路由:api函数
		student.POST("delete", studentController.StudentDelete)
	}
}

student_controller.go

package api

import (
	"awesomeProject/models"
	"awesomeProject/service"
	"github.com/gin-gonic/gin"
	"net/http"
)

type StudentController struct {
	StudentService *service.StudentService
}

/**
 * @Description: 学生控制器
 * @return *StudentController
 */

func NewStudentController() *StudentController {
	return &StudentController{StudentService: service.NewStudentService()}
}

/**
 * @Description: 查询全部数据
 * @receiver h
 * @param c
 */

func (h *StudentController) StudentGetAll(c *gin.Context) {
	Students, err := h.StudentService.Select()
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"code": "500", "msg": err.Error()})
		return
	}
	c.JSON(http.StatusOK, gin.H{"code": "200", "msg": "OK", "data": Students})
}

/**
 * @Description: 新增
 * @receiver h
 * @param c
 */

func (h *StudentController) StudentAdd(c *gin.Context) {
	var student models.Student //注意该结构接受的内容
	c.ShouldBind(&student)
	err := h.StudentService.Add(student)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"code": "500", "msg": err.Error()})
		return
	}
	c.JSON(http.StatusOK, gin.H{"code": "200", "msg": "添加数据成功"})
}

/**
 * @Description: 修改
 * @receiver h
 * @param c
 */

func (h *StudentController) StudentUpdate(c *gin.Context) {
	var student models.Student //注意该结构接受的内容
	c.ShouldBind(&student)
	err := h.StudentService.Update(student)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"code": "500", "msg": err.Error()})
		return
	}
	c.JSON(http.StatusOK, gin.H{"code": "200", "msg": "修改数据成功"})
}

/**
 * @Description: 删除
 * @receiver h
 * @param c
 */

func (h *StudentController) StudentDelete(c *gin.Context) {
	var student models.Student //注意该结构接受的内容
	c.ShouldBind(&student)
	err := h.StudentService.Delete(student)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"code": "500", "msg": err.Error()})
		return
	}
	c.JSON(http.StatusOK, gin.H{"code": "200", "msg": "删除数据成功"})
}

student.go

package models


type Student struct {
	Id int
	Name string
	Gender string
}

func (Student) TableName() string {
	return "Student"
}

student_repository.go

package repository

import (
	"awesomeProject/models"
	"awesomeProject/until"
)

type StudentRepository struct{}

func NewStudentRepository() *StudentRepository {
	return &StudentRepository{}
}

/**
 * @Description: 查找数据
 * @receiver h
 * @return []models.Student
 * @return error
 */

func (h *StudentRepository) FindAll() ([]models.Student, error) {
	var students []models.Student
	// 查询表数据
	result := until.SqlDB.Find(&students)
	return students, result.Error
}

/**
 * @Description: 增加一个数据
 * @receiver h
 * @param student
 * @return error
 */

func (h *StudentRepository) InsertOne(student models.Student) error {
	result := until.SqlDB.Create(&student)
	return result.Error
}

/**
 * @Description: 更新一个数据
 * @receiver h
 * @param student
 * @return error
 */

func (h *StudentRepository) UpdateOne(student models.Student) error {
	result := until.SqlDB.Save(&student)
	return result.Error
}

/**
 * @Description: 删除一个数据
 * @receiver h
 * @param student
 * @return error
 */

func (h *StudentRepository) DeletetOne(student models.Student) error {
	result := until.SqlDB.Delete(&models.Student{}, student.Id)
	return result.Error
}

student_service.go

package service

import (
	"awesomeProject/models"
	"awesomeProject/repository"
)

type StudentService struct {
	StudentRepository *repository.StudentRepository
}

func NewStudentService() *StudentService {
	return &StudentService{
		StudentRepository: repository.NewStudentRepository(),
	}
}

func (h *StudentService) Select() ([]models.Student, error) {
	all, err := h.StudentRepository.FindAll()
	if err != nil {
		return nil, err
	}
	return all, nil
}

func (h *StudentService) Add(student models.Student) error {
	return h.StudentRepository.InsertOne(student)
}

func (h *StudentService) Update(student models.Student) error {
	return h.StudentRepository.UpdateOne(student)
}

func (h *StudentService) Delete(student models.Student) error {
	return h.StudentRepository.DeletetOne(student)
}

gormClient.go

package until

import (
	"gorm.io/driver/sqlserver"
	"gorm.io/gorm"
	"reflect"
)

/**
 * @Description:全局 DB
 */

var (
	SqlDB *gorm.DB
)

/**
 * @Description: 初始化数据库
 * @return *gorm.DB
 */

func SqlClient() *gorm.DB {
	if SqlDB == nil || reflect.DeepEqual(SqlDB, gorm.DB{}) {
		_Sql_db, err := gorm.Open(sqlserver.Open("sqlserver://cuyan:123456@120.79.19.125:1433?database=cuyan"), &gorm.Config{})
		if err != nil {
			panic("failed to connect database")
		}
		SqlDB = _Sql_db
		return _Sql_db
	}
	return SqlDB
}

结果展示

查询:http://localhost:10001/api/student/getAll

在这里插入图片描述

新增:http://localhost:10001/api/student/add

{
    "Name": "测试01",
    "Gender": 1
}

在这里插入图片描述

再查询:http://localhost:10001/api/student/getAll

在这里插入图片描述

修改:http://localhost:10001/api/student/update

{"Id":50040,"Name":"测试02","Gender":1}

在这里插入图片描述

再查询:http://localhost:10001/api/student/getAll

在这里插入图片描述

删除:http://localhost:10001/api/student/delete

{"Id":50040,"Name":"测试02","Gender":1}

在这里插入图片描述

再查询:http://localhost:10001/api/student/getAll

在这里插入图片描述