简单使用Gin和Gorm搭建一个系统(一)

547 阅读4分钟

一、搭建根目录与资源目录。

环境搭建Gin+Gorm+MySql。

Gin是一个golang的WEB框架,很轻量,依赖到很少,有些类似Java的SpringMVC,通过路由设置,可以将请求转发到对应的处理器上。

Gorm是Go语言的ORM框架,提供一套对数据库进行增删改查的接口,使用它,就可以类似Java使用Hibernate框架一样,可对数据库进行相应操作。

若要用到这两套框架,就需要import依赖进来,依赖进来前,需要Go命令安装Gin和Gorm。

go get -u github.com/gin-gonic/gin
go get -u github.com/jinzhu/gorm

在用gin框架搭建后端项目之前,可以借鉴java后端的项目结构,采用MVC的项目结构,我们可以先搭建一个项目大体框架,然后在项目的空洞处进行填写代码。

在go根目录底下,创建controller、service、dao、entity包,另外,还需要一个router包,用于存放路由文件。在创建完这些包以后,若在SpringBoot项目里,是否还缺少一个xxxxxApplication.java的启动类,没错,在Go里,同样需要一个启动类,该启动类文件可以直接命名为main.go。

image-20241125212517879.png

接下来,是在resources资源目录创建一个application.yaml配置文件,当然,这个配置文件可以随便命名,不用像SpringBoot那样需要考虑其命名背后所代表的优先级。

image-20241125212551122.png

这个配置文件里,就存放需要用到的Mysql数据库连接信息:

url: 127.0.0.1
userName: root  //填写实际的数据库账号
password: 123456    //填写实际的数据库密码
dbname: soa     //填写实际的数据库名称
post: 3306

二.dao层的搭建。

在dao层下,建立一个mysql.go文件,这个文件在dao的包下,最初的效果如下

image-20241125212815127.png

这里我先导入这个问价所需要的包:

这里我们不仅需要导入gorm的包还需要导入对应的数据库的包,我这里导入的是mysql的包

import (
    "bytes"
    "fmt"
    "gopkg.in/yaml.v2"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "io"
    "log"
    "os"
)

然后需要定义一个结构体,用于接收yaml文件的参数,来进行数据库的连接:

type conf struct {
    Url      string `yaml:"url"`
    UserName string `yaml:"userName"`
    Password string `yaml:"password"`
    DbName   string `yaml:"dbname"`
    Port     string `yaml:"post"`
}

然后提供一个读取解析该yaml配置的方法,将读取到的配置参数数据转换成上边的结构体conf:

func (c *conf) getConf() *conf {
    //读取resources/application.yaml文件
    yamlFile, err := os.Open("resources/application.yaml")
    //若出现错误,打印错误提示
    defer yamlFile.Close()
    // 读取文件内容到字节切片
    var fileContent bytes.Buffer
    _, err = io.Copy(&fileContent, yamlFile)
    if err != nil {
       fmt.Println(err.Error())
    }
    //将读取的字符串转换成结构体conf
    err = yaml.Unmarshal(fileContent.Bytes(), c)
    if err != nil {
       fmt.Println(err.Error())
    }
    return c
}

然后创建一个SqlSession变量,该变量起到作用于mybatis的SqlSession实例类似,在数据库驱动连接成功后,即可提供select/insert/update/delete方法。

var SqlSession *gorm.DB

然后就可以定义一个初始化数据库连接的方法,该方法在启动项目时执行

func InitSql() (error error) {
    var c conf
    conf := c.getConf()
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
       conf.UserName,
       conf.Password,
       conf.Url,
       conf.Port,
       conf.DbName)
​
    SqlSession, error = gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if error != nil {
       panic(error)
    }
    sqlDB, err := SqlSession.DB()
    if err != nil {
       panic(err)
    }
    // Ping 数据库
    return sqlDB.Ping()
}

然后还需要一个关闭数据库连接的方法:

func Close() {
    if SqlSession == nil {
       log.Println("Sqlsession is nil, nothing to close.")
       return
    }
​
    sqlDB, err := SqlSession.DB()
    if err != nil {
       log.Printf("Failed to get raw database connection: %v", err)
       return
    }
​
    if sqlDB == nil {
       log.Println("Underlying *sql.DB is nil, nothing to close.")
       return
    }
​
    // 关闭数据库连接
    err = sqlDB.Close()
    if err != nil {
       log.Printf("Failed to close database connection: %v", err)
    } else {
       log.Println("Database connection closed successfully.")
    }
}

这样我们的dao层就搭建好了。

三.entity层定义模型

注意一点,这里需要明确指出,其struct结构体映射到哪一张表

type Book struct {
    BookId    int64  `json:"book_id"`
    Title     string `json:"title"`
    Author    string `json:"author"`
    Isbn      string `json:"isbn"`
    Available int    `json:"available"`
}
​
func (Book) TableName() string {
    return "book"   //数据库表名
}

到这一步就完成了book模型关系的建立,完成了一个最基础的entity层的搭建

在今天的搭建后端的过程中,也是遇到了一部分困难。在读取yaml文件的时候对于os和io的库的不熟悉,导致不知道如何对数据进行读取。对于go的一部分错误处理也十分的不熟悉,对于defer的用法以及接收参数err的部分。

然后在初始化数据库的代码中,我在网上查阅的资料,一部分的gorm初始化代码已经过时了,更新换代的很快,所以在这方面遇到了点问题。