(1).gorm是go中最流行的orm框架
gorm中文文档

orm框架帮助开发者提升了效率,封装了sql,开发者不用直接写sql,还有很多语法糖
可我们注意的是,sql很重要,我们只有越来越懂sql,才能做到使用orm游刃有余~

(2).我们来分析下GetUserList接口,它的功能:

  1. 返回用户列表
  2. 有分页功能

下面,参照下接口返回的内容:

{
    "code": 200,
    "data": {
        "total": 2,
        "userlist": [
            {
                "address": "",
                "birthday": "2021-06-02",
                "desc": "",
                "gender": "",
                "head_url": "",
                "id": 3,
                "mobile": "13999189292",
                "nick_name": "peiyahui2",
                "role": 1
            },
            {
                "address": "",
                "birthday": "2021-06-02",
                "desc": "",
                "gender": "",
                "head_url": "",
                "id": 4,
                "mobile": "13999189293",
                "nick_name": "peiyahui3",
                "role": 1
            }
        ]
    },
    "msg": "成功获取用户列表"
}

复制代码

2. 安装gorm

go get	gorm.io/driver/mysql  // 安装mysql驱动
go get	gorm.io/gorm  
复制代码

3.定义表结构的struct

在 models/user.go 中编写

package models
import "time"
type User struct {
	ID       uint      `json:"id" gorm:"primaryKey"`
	Password string    `json:"password"`
	NickName string    `json:"nick_name"`
	HeadUrl  string    `json:"head_url"`
	Birthday *time.Time `json:"birthday" gorm:"type:date"`
	Address  string    `json:"address"`
	Desc     string    `json:"desc"`
	Gender   string    `json:"gender"`
	Role     int       `json:"role"`
	Mobile   string    `json:"mobile"`
}

// 设置User的表名为`profiles`
func (User) TableName() string {
	return "user"
}
复制代码

4. 编写 InitMysql函数做初始化mysql驱动

(1).在 initialize/mysql 当中编写

package initialize

import (
	"fmt"
	"go_gin/global"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)
 
func InitMysqlDB() {
	mysqlInfo := global.Settings.Mysqlinfo
	// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		mysqlInfo.Name, mysqlInfo.Password, mysqlInfo.Host,
		mysqlInfo.Port, mysqlInfo.DBName)
	db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	global.DB = db
}

复制代码

几个注意的点:
1. global.Settings.Mysqlinfo里面的信息在讲Viper处理yaml配置信的时候讲过
2. 一定要确保mysql地址,密码,用户名,端口号别写错了,用navicat试着链接下
3. 在yaml的配置不要空格!!(一定注意)
4. 这里的 global.DB 是在globalVar.go中加入

    //globalVar.go
    DB    *gorm.DB
复制代码

(2).测试

在 main.go中引入

// 5.初始化mysql
initialize.InitMysqlDB()
复制代码

并启动项目,如果没有报错,说明数据库的驱动就已经链接好了

4.创建user表

(1).navicat链接mysql

(2).下载sql文件在数据库中导入

5.编写dao层的,操作数据库

在 dao/user.go中编写 GetUserListDao 函数

package dao

import (
	"go_gin/global"
	"go_gin/models"
)

var users []models.User

// GetUserList 获取用户列表(page第几页,page_size每页几条数据)
func GetUserListDao(page int, page_size int) (int, []interface{}) {
	// 分页用户列表数据
	userList := make([]interface{}, 0, len(users))
	// 计算偏移量
	offset := (page - 1) * page_size
	// 查询所有的user
	result := global.DB.Offset(offset).Limit(page_size).Find(&users)
	// 查不到数据时
	if result.RowsAffected == 0{
		return 0, userList
	}
	// 获取user总数
	total := len(users)
	// 查询数据
	result.Offset(offset).Limit(page_size).Find(&users)
	//
	for _, useSingle := range users {
		birthday := ""
		if useSingle.Birthday == nil {
			birthday = ""
		}else {
			// 给未设置生日的初始值
			birthday = useSingle.Birthday.Format("2006-01-02")
		}
		userItemMap := map[string]interface{}{
			"id":        useSingle.ID,
			"password":  useSingle.Password,
			"nick_name": useSingle.NickName,
			"head_url":  useSingle.HeadUrl,
			"birthday":  birthday,
			"address":   useSingle.Address,
			"desc":      useSingle.Desc,
			"gender":    useSingle.Gender,
			"role":      useSingle.Role,
			"mobile":    useSingle.Mobile,
		}
		userList = append(userList, userItemMap)
	}
	return total, userList
}

复制代码

ps: 注释写的很清楚,最后返回的是 user表中总数和查询到数据

6.编写controller层的GetUserList函数

controller层是完成业务的整合,返回用户数据 在 controller/user 中编写GetUserList函数

// GetUserList 获取用户列表
func GetUserList(c *gin.Context) {
	// 获取参数
	UserListForm := forms.UserListForm{}
	if err := c.ShouldBind(&UserListForm); err != nil {
		utils.HandleValidatorError(c, err)
		return
	}
	// 获取数据
	total, userlist := dao.GetUserListDao(UserListForm.Page, UserListForm.PageSize)
	// 判断
	if (total + len(userlist)) == 0 {
		Response.Err(c, 400, 400, "未获取到到数据", map[string]interface{}{
			"total":    total,
			"userlist": userlist,
		})
		return
	}
	Response.Success(c, 200, "获取用户列表成功", map[string]interface{}{
		"total":    total,
		"userlist": userlist,
	})
}