这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天
1.复习已学知识
- 复习依赖管理
- 复习单元测试
- 复习如何高质量编程知识
- 复习性能优化的自动内存管理
- 复习如何内存分配和对编译器的优化
2.观看录播Go框架三件套详解(Web/RPC/ORM)
一、GKH框架三件套
1.Gorm框架
开始我们首先要清楚Gorm框架是干什么的?一开始我也是一头雾水因为没学过哈哈----- 不过它告诉我们Gorm是ORM框架,这不就明白它大致是做什么了。ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。学过Java的同学,是不是有那味了?(偷笑-----) 说白了:Gorm 是 Go 语言中实现对象和数据库映射的框架,可以有效地提高开发数据库应用的效率。 Gorm 主要用途是把 struct类型 和 数据库表 进行映射,使用简单方便。 因此,使用 Gorm 操作数据库的时候一般不需要直接手写 SQL 语句代码。这下开始知道他大概是做什么了,接下来就来分析如何操作了。
代码示例:
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"fmt"
"time"
"errors"
)
// 定义 User 数据模型,绑定数据库中 users 表
// Gorm 操作数据库,需要定义一个 struct 类型和 Mysql 表进行绑定或者叫映射
// struct 中的字段 和 Mysql 表的字段一一对应
// 在这里 User 类型可以代表 Mysql user表
type User struct {
ID int64 // 主键
// 通过在字段后面的标签说明,定义golang字段和表字段的关系
// 例如 `gorm:"column:username"` 标签说明含义是: Mysql 表的列名为 username
// 这里 golang 定义的 Username 变量和 Mysql 表字段 username 一样,他们的名字可以不一样。
Username string `gorm:"column:username"`
Password string `gorm:"column:password"`
CreateTime int64 `gorm:"column:createtime"`
}
// 设置表名,可以通过给 struct 类型定义 TableName 函数,返回当前 struct 绑定的 Mysql 表名是什么
func (u User) TableName() string {
// 绑定 Mysql 表名为 users
return "users"
}
func main() {
// 配置 MySQL 连接参数
username := "root" //账号
password := "123456" //密码
host := "127.0.0.1" //数据库地址,可以是Ip或者域名
port := 3306 //数据库端口
Dbname := "codebaoku" //数据库名
// 通过前面的数据库参数,拼接 Mysql DSN,其实就是数据库连接串(数据源名称)
// Mysql dsn格式: {username}:{password}@tcp({host}:{port})/{Dbname}?charset=utf8&parseTime=True&loc=Local
// 类似{username}使用花括号包着的名字都是需要替换的参数
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname)
// 连接 Mysql
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
// 定义一个用户,并初始化数据
u := User{
Username:"codebaoku",
Password:"123456",
CreateTime:time.Now().Unix(),
}
// 插入一条用户数据
// 下面代码会自动生成SQL语句:INSERT INTO `users` (`username`,`password`,`createtime`) VALUES ('codebaoku','123456','1540824823')
if err := db.Create(&u).Error; err != nil {
fmt.Println("插入失败", err)
return
}
// 查询并返回第一条数据
// 定义需要保存数据的struct变量
u = User{}
// 自动生成sql: SELECT * FROM `users` WHERE (username = 'codebaoku') LIMIT 1
result := db.Where("username = ?", "codebaoku").First(&u)
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
fmt.Println("找不到记录")
return
}
// 打印查询到的数据
fmt.Println(u.Username,u.Password)
// 更新数据库记录
// 自动生成Sql语句: UPDATE `users` SET `password` = '654321' WHERE (username = 'codebaoku')
db.Model(&User{}).Where("username = ?", "codebaoku").Update("password", "654321")
// 删除数据库记录
// 自动生成Sql: DELETE FROM `users` WHERE (username = 'codebaoku')
db.Where("username = ?", "codebaoku").Delete(&User{})
}
注意事项:
- Fist踩坑注意:使用Fist时,需要注意查询不到数据会返回ErrRecordNotFound。使用Find查询多条数据,查询不到数据不会返回错误。
- 使用结构体作为条件查询时,GORM只会查询非零值字段。这意味着如果你的值为0,",false或其他零值,该字段不会被用于用于构建查询条件,使用Map来构建查询条件。
- 使用Struct更新时,只会更新非0值,如果需要更新0值可以使用Map更新或者使用Select选择字段。
物理删除和软删除
其实说白了就是一个是真正在删除了一个没有,如图解释