在《Gin框架搭建Golang接口项目模板--controller层》中大概介绍了下怎么使用gin创建一个简单的api接口,但是在实际开发中,只有接口定义没有数据库的交互,就不算是一个完整的项目。在本项目中,使用了gorm作为持久层的一个框架,官方文档地址为:gorm,数据库选用MySQL,下面详细介绍下怎么使用gorm完成数据库的交互。
第一步:引入gorm依赖和MySQL驱动
引入gorm依赖和MySQL驱动很简单,执行下面命令:
// 引入gorm依赖
go get -u gorm.io/gorm
// 引入MySQL驱动
go get -u gorm.io/driver/mysql
第二步:完成数据库的初始化
在企业级项目中不会直接将数据源信息直接写入代码中,会有一个配置文件对项目的配置信息进行统一的维护,这里采用yml格式作为配置文件。这里多提一句,有些项目可能会采用tom文件作为项目的配置文件,虽然官方说有很多好处,但是我个人还是比较喜欢yml,根据个人选择。配置信息如下:
- 配置文件
server:
port: 8848
# 数据源配置
datasource:
driverName: mysql
host: 127.0.0.1
port: "3306"
dbname: gin_temp
username: root
password: root123
charset: utf8
sslmode: disable
loc: Asia/Shanghai
读取配置文件这里用到了viper,引入viper的依赖使用命令:go get -u github.com/spf13/viper 。接下来需要在项目入口文件(main.go)加入配置文件的初始化,配置代码在main.go文件新建一个函数处理,如下:
func InitConfig() {
var envPara = "/src/config"
workDir, _ := os.Getwd()
viper.SetConfigName("base")
viper.SetConfigType("yml")
viper.AddConfigPath(workDir + envPara)
fmt.Println(workDir)
err := viper.ReadInConfig()
if err != nil {
panic(err)
}
}
- 数据库初始化
在database包下创建数据库的初始化代码,如下:
var DB *gorm.DB
func InitDB() *gorm.DB {
host := viper.GetString("datasource.host")
port := viper.Get("datasource.port")
database := viper.GetString("datasource.dbname")
username := viper.GetString("datasource.username")
password := viper.GetString("datasource.password")
charset := viper.GetString("datasource.charset")
loc := viper.GetString("datasource.loc")
dns := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true&loc=%s",
username,
password,
host,
port,
database,
charset,
url.QueryEscape(loc))
db, err := gorm.Open(mysql.Open(dns), &gorm.Config{})
if err != nil {
panic("failed to connect database, err: " + err.Error())
}
DB = db
return db
}
- 初始化配置文件和数据库连接
在项目的入口(main.go)中添加配置文件初始化和数据库连接,如下:
func main() {
InitConfig()
database.InitDB()
r := gin.New()
r = route.PathRoute(r)
r.Run()
}
第三步:数据表脚本创建表
这里很简单,直接贴出脚本:
CREATE TABLE `t_user` (
`user_id` bigint(20) NOT NULL COMMENT '主键',
`user_name` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`gender` int(1) DEFAULT NULL COMMENT '性别(1:男,2:女)',
`create_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
第四步:创建表映射
在项目中新建数据表的映射实体,代码如下:
type User struct {
database.CommonTableData
UserId int64 `gorm:"primaryKey; not null" json:"userId" description:"用户id"`
UserName string `gorm:"varchar(128); not null" json:"userName" description:"用户名"`
Age int8 `gorm:"varchar(128); not null" json:"age" description:"年龄"`
Gender int8 `gorm:"varchar(256); not null" json:"gender" description:"性别"`
}
func (User) TableName() string {
return "t_user"
}
这里使用到了gorm的tag,可以去官方文档直接查看。
第五步:持久层接口定义及实现
这里都是go语言的基础知识,就不多做介绍,如下:
type IUserRepository interface {
FindUser(*int64) (*entity.User, error)
}
type UserManagerRepository struct {
}
func NewUserManagerRepository() IUserRepository {
return &UserManagerRepository{}
}
func (u UserManagerRepository) FindUser(userId *int64) (*entity.User, error) {
var user entity.User
database.DB.Where("user_id = ?", &userId).First(&user)
return &user, nil
}
第六步:service逻辑编写
在持久层获取到数据之后,在service层会添加业务逻辑相关的代码,这里就介绍一个比较简单的数据查询,如下:
type IUserService interface {
FindUserInfo(*gin.Context, *int64)
}
type UserService struct {
userRepository repository.IUserRepository
}
func NewUserService(repository repository.IUserRepository) IUserService {
return &UserService{repository}
}
func (us UserService) FindUserInfo(ctx *gin.Context, userId *int64) {
user, _ := us.userRepository.FindUser(userId)
if user == nil {
response.Success(ctx, constant.DataIsNilCode, constant.DataIsNilMsg, nil)
} else {
userVo := &vo.UserVO{
UserId: user.UserId,
UserName: user.UserName,
Age: user.Age,
Gender: user.Gender,
}
response.Success(ctx, constant.SelectSuccessCode, constant.SelectSuccessMsg, userVo)
}
}
第七步:controller代码调整
调整上一章中控制层的代码,如下:
type UserController struct {
userService service.IUserService
}
func UserRegister(userGrp *gin.RouterGroup) {
userRepository := repository.NewUserManagerRepository()
userService := service.NewUserService(userRepository)
userController := &UserController{userService: userService}
userGrp.Use().POST("/findUser", userController.findUser)
}
func (uc UserController) findUser(ctx *gin.Context) {
var userQuery query.FindUserQuery
_ = ctx.Bind(&userQuery)
uc.userService.FindUserInfo(ctx, &userQuery.UserId)
}
第八步:运行项目
启动项目请求接口,如下:
至此项目集成gorm框架完成了数据库的交互,项目相关代码已提交至github,地址:https://github.com/WXCTX007/golang.git