初学 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