选择gorm框架的原因,在阅读了很多go语言数据库操作的文章之后,发现大多数使用的都是grom框架。然后我就去官方文档里面去学习用法,发现这是一个类似于Mybatis的框架,所以学起来也比较容易,因此分享一下使用的过程和学习心得。
目录
一、框架介绍
二、实现方法
1、连接配置
2、实体类
3、CRUD接口
(1)查询
(2)新增
(3)更新
(4)删除
三、运行调试
1、App.go函数代码
2、分步运行结果
(1)查询所有数据
(2)根据主键查询
(3)根据名字模糊查询
(4)新增
(5)更新
(6)删除
四、总结与一些发现的分享
官网传送门:https://gorm.io/zh_CN/docs/index.html
官网有很详细的介绍,这里不过多叙述。
先上代码
package config
import (
"fmt"
"github.com/spf13/viper"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var DB *gorm.DB
type attribute struct {
driver string
url string
username string
password string
database string
}
type connect struct {
at attribute
dsn string
}
func Mysql() {
//读取文件
viper.SetConfigFile("app.yml")
fmt.Println("正在读取文件app.yml")
//处理错误
err := viper.ReadInConfig()
if err == nil {
fmt.Println("正在处理读取异常,无异常")
}
//属性读取并赋值
var a = attribute{
driver: viper.GetString("mysql.driver"),
url: viper.GetString("mysql.url"),
username: viper.GetString("mysql.username"),
password: viper.GetString("mysql.password"),
database: viper.GetString("mysql.database"),
}
fmt.Println("正在属性读取并赋值")
//创建数据库连接
var con = connect{
at: a,
dsn: a.username + ":" + a.password + "@tcp(" + a.url + ")/" + a.database + "?charset=utf8mb4&parseTime=True&loc=Local",
}
fmt.Println("正在创建数据库连接")
//连接语句
DB, err = gorm.Open(mysql.Open(con.dsn), &gorm.Config{})
if err == nil {
fmt.Println("mysql连接成功")
}
}
这里是通过viper函数来读取app.yml文件,这里注意一下yml文件的书写格式
mysql:
driver: mysql
url: your IP:port
username: van
##这里的密码加上单引号才不会报错,不然不会被正常识别为字符串
password: 'password'
database: dbName
整体的代码还是比较易读的,这里不过多讲解过程,最后通过gorm.open函数进行数据库连接的建立。
这里与SpringMVC中的实体类一样,但是代码有些许不同。
type Users struct {
Id int `json:"id"`
Username string `json:"username"`
Password string `json:"password"`
Mid int `json:"mid"`
}
func (user Users) TableName() string {
return "user"
}
需要注意的是struct下的字段名第一个字母需要大写,不然会报错,在GoLand他会变成橙色,也可以通过GoLand的提示一键修改。
首先定义了两个结果对象,分别对应了某一条数据和某几条数据,这一点从定义上就可以看出来,主要用在后面函数返回的结果上。
var results []Users
var result Users
实现的过程比较简单,主要是grom框架将sql语句封装好了,我们只需要传入对象或者需要的值即可完成,值得注意的是&result前面的&,在java中写习惯之后好几次都忘记加了。
// FindAll 返回所有信息
func FindAll() []Users {
config.DB.Find(&results)
return results
}
// FindById 返回根据主键检索(一条数据)
func FindById(index int) Users {
config.DB.First(&result, index)
return result
}
// FindByName 条件查询
func FindByName(name string) []Users {
config.DB.Where("username LIKE ?", "%"+name+"%").Find(&results)
return results
}
这里为了了解新增语句的返回值中的属性,官方文档中指出的有新增数据的主键id、错误、影响行数,因此在这里定义了一个结构体用于把这些信息返回查看,当然也可以直接打印出来。
// Add 新增数据
func Add(users Users) struct {
id int
err error
row int64
} {
r := config.DB.Create(&users)
return struct {
id int
err error
row int64
}{id: users.Id, err: r.Error, row: r.RowsAffected}
}
语句比较易读,主要就是设置更新的条件,这里我是选择传入一个对象的所有属性,但是只将ID作为判断条件,从而根据ID更新该条数据
// Update 根据主键修改数据
func Update(users Users) struct {
row int64
err error
} {
r := config.DB.Model(Users{}).Where("id=?", users.Id).Updates(users)
return struct {
row int64
err error
}{row: r.RowsAffected, err: r.Error}
}
与前面类似
// 根据主键删除
func Delete(index int) struct {
row int64
err error
} {
r := config.DB.Delete(&Users{}, index)
return struct {
row int64
err error
}{row: r.RowsAffected, err: r.Error}
}
package main
import (
"Server/config"
"Server/model"
"fmt"
)
// 启动函数,也可以将Mysql配置函数直接命名为init
// 会自动识别启动
func init() {
config.Mysql()
}
func main() {
//查询所有数据
fmt.Println(model.FindAll())
//根据主键查询
fmt.Println(model.FindById(2))
//根据名字模糊查询
fmt.Println(model.FindByName("xiao"))
NewUser := model.Users{
Id: 20,
Username: "TestName",
Password: "test",
Mid: 0,
}
//新增
fmt.Println(model.Add(NewUser))
UpdateUser := model.Users{
Id: 20,
Username: "TestName",
Password: "NewPaaword",
Mid: 0,
}
//更新
fmt.Println(model.Update(UpdateUser))
//删除
fmt.Println(model.Delete(20))
}
这里在使用GoLand的调试功能的时候出错了,因为我的电脑是m1,但是GoLand的版本不对,虽然其他的功能可以使用,但是这个功能用不了,于是我去官网重新下载了m1版本的替换了之后便可以进行断点调试了。
有一个点是在mysql的配置函数启动时发现的,之前按照一片文章写了配置文件之后可以正常启动,但是这次我在自己写的过程中,总是出现一个说无指针的错误,只有在进行配置函数调用之后才不会报错,于是我进行了下面这样的编写
// 启动函数,也可以将Mysql配置函数直接命名为init
// 会自动识别启动
func init() {
config.Mysql()
}
发现这样就用每次都在main函数调用配置函数了,然后我再去看之前的项目,他直接把配置函数名设置成了init,于是乎就可以自动调用。
这次分享了一些基于gorm框架的CRUD的操作的实现,在此基础之上接下来可以试着去写gin框架下的返回JSON数据的接口了。如果有叙述不准确的地方还请指出哈。
gitee项目源码:https://gitee.com/shenyufan/go-lang.git