Go入门-基于GORM框架的CRUD操作(mysql增删改查)

选择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

官网有很详细的介绍,这里不过多叙述。


二、实现方法

1、连接配置

先上代码

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函数进行数据库连接的建立。


2、实体类

这里与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的提示一键修改。


3、CRUD接口

首先定义了两个结果对象,分别对应了某一条数据和某几条数据,这一点从定义上就可以看出来,主要用在后面函数返回的结果上。

var results []Users
var result Users

(1)查询

实现的过程比较简单,主要是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
}

(2)新增

这里为了了解新增语句的返回值中的属性,官方文档中指出的有新增数据的主键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}
}

(3)更新

语句比较易读,主要就是设置更新的条件,这里我是选择传入一个对象的所有属性,但是只将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}
}

(4)删除

与前面类似

// 根据主键删除
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}
}

三、运行调试

1、App.go函数代码

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))
}

2、分步运行结果

这里在使用GoLand的调试功能的时候出错了,因为我的电脑是m1,但是GoLand的版本不对,虽然其他的功能可以使用,但是这个功能用不了,于是我去官网重新下载了m1版本的替换了之后便可以进行断点调试了。

(1)查询所有数据

Go入门-基于GORM框架的CRUD操作(mysql增删改查)_第1张图片

(2)根据主键查询

Go入门-基于GORM框架的CRUD操作(mysql增删改查)_第2张图片

(3)根据名字模糊查询

Go入门-基于GORM框架的CRUD操作(mysql增删改查)_第3张图片

 (4)新增

(5)更新

 (6)删除


 四、总结与一些发现的分享

有一个点是在mysql的配置函数启动时发现的,之前按照一片文章写了配置文件之后可以正常启动,但是这次我在自己写的过程中,总是出现一个说无指针的错误,只有在进行配置函数调用之后才不会报错,于是我进行了下面这样的编写

// 启动函数,也可以将Mysql配置函数直接命名为init
// 会自动识别启动
func init() {
	config.Mysql()
}

发现这样就用每次都在main函数调用配置函数了,然后我再去看之前的项目,他直接把配置函数名设置成了init,于是乎就可以自动调用。
这次分享了一些基于gorm框架的CRUD的操作的实现,在此基础之上接下来可以试着去写gin框架下的返回JSON数据的接口了。如果有叙述不准确的地方还请指出哈。


gitee项目源码:https://gitee.com/shenyufan/go-lang.git​​​​​​​

你可能感兴趣的:(Go语言入门,mysql,golang,mybatis)