(1).gorm是go中最流行的orm框架
gorm中文文档
orm框架帮助开发者提升了效率,封装了sql,开发者不用直接写sql,还有很多语法糖
可我们注意的是,sql很重要,我们只有越来越懂sql,才能做到使用orm游刃有余~
(2).我们来分析下GetUserList接口,它的功能:
- 返回用户列表
- 有分页功能
下面,参照下接口返回的内容:
{
"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,
})
}