一、搭建根目录与资源目录。
环境搭建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。
接下来,是在resources资源目录创建一个application.yaml配置文件,当然,这个配置文件可以随便命名,不用像SpringBoot那样需要考虑其命名背后所代表的优先级。
这个配置文件里,就存放需要用到的Mysql数据库连接信息:
url: 127.0.0.1
userName: root //填写实际的数据库账号
password: 123456 //填写实际的数据库密码
dbname: soa //填写实际的数据库名称
post: 3306
二.dao层的搭建。
在dao层下,建立一个mysql.go文件,这个文件在dao的包下,最初的效果如下
这里我先导入这个问价所需要的包:
这里我们不仅需要导入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初始化代码已经过时了,更新换代的很快,所以在这方面遇到了点问题。