Gin框架搭建Golang接口项目模板–ORM实现

《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


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ILV_XJ/article/details/117035570