本次项目MySQL数据库操作采用的类库是GORM的最新版本V1.20.12,它是一个神奇的,对开发人员友好的 Golang ORM 库。官方地址: https://gorm.io/
什么是ORM?
ORM 全称 Object Relation Mapping 对象映射关系,目的是解决面向对象和关系数据库之间存在的互不匹配的现象。
sql注入曾经是一种常见的网络攻击方式,针对程序编写疏忽而产生的问题比如:通过sql语句实现无账号登录、删除甚至篡改数据库。
orm就很好的解决了这些问题,在其底层逻辑中会带有转义操作,不担心注入问题,而且对于我们的struct结构体而言,也提供了对应关系操作,对于编程者来说是极大地便利:将注意力从数据库的细节转移到业务逻辑上。orm作为中间层,可以简化数据库的迁移操作。
当然,orm也是有缺点的:不能够生成所有的sql业务语句,有些复杂的还是需要sql原生语句操作;性能低于直接使用sql语句的。
什么是GORM?
GORM就是Go语言版本实现的ORM,官方定义是:
The fantastic ORM library for Golang aims to be developer friendly.
GORM使用方式
安装之后,导入包即可
//安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
//使用
import (
"gorm.io/gorm"
"gorm.io/driver/sqlite"
)
dbName := config.GetString("zkbhj_db.name")
user := config.GetString("zkbhj_db.user")
port := config.GetInt("zkbhj_db.port")
password := config.GetString("zkbhj_db.password")
host := config.GetString("zkbhj_db.host")
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", user, password, host, port, dbName)
if db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}); err != nil {
panic(err)
} else {
MusicDB = db
}
GORM更多使用方式
//创建表
//CREATE TABLE users( name VARCHAR(50), age INT);
type User struct{
name stringg
age int
}
db.Table(“users”).CreateTable(&User{})
//插入数据
//INSERT INTO users (name, age) VALUES ('ee','18');
user := User{
name : "ee",
age : 18,
}
db.Create(&user)
//查询数据
//SELECT * FROM users WHERE name="ee";
var users [ ]User//定义一个User类型的数组名字叫做users
db.Where(“name=?”,”ee”).Find(&users) //方法1:查询所有结果放入users数组
db.Where(&User{name:”ee”,age:18}).Find(&users)
db.Where(map[string] interface{}{"name":"ee","age":18}).Find(&users)
//读取第1条
//SELECT * FROM users WHERE name="ee" limit 1;
var user User
db.Where("name=?","ee").First(&user)
//LIMIT多条
//SELECT * FROM users LIMIT 3;
var users [ ]User
db.Limit(3).Find(&users)
//LIKE AND IN
//SELECT * FROM users WHERE role='admin' OR role ='super_admin';
db.Where("role=?","admin”).Or("ole=?",super_admin").Find(&users)
db.Where("name LIKE ?","%ee%").Find(&user)
db.Where("name=? AND age>=?”, "ee", "18").Find(&users)
db.Where("name in (?)",[ ]string{"ee","sh"}).Find(&usere)
//部分字段和排序
db.Select(“name, age”).Find(&users)
db.Select([ ]string{“name”,”age”}).Find(&users)
db.Order("age desc").Order("name").Find(&users)
//数据记录数
//SELECT count(*) FROM users WHERE name ='ee';
var count int
db.Where("name=?","ee").Count(&count)
//数据更新
//UPDATE users SET name='hello' WHERE id=111;
var user User
db.Where("id=?", "111").First(&user)
Db.Model(&user).Update("name","hello")
db.Model(&user).Updates(map[string]interface{}{“name”:”hello”,”age”:18})
db.Model(&user).Update(User{name:"hello",age:18})
//删除
//DELETE FROM users WHERE id=10;
var user User
db.Where("id=?","10").First(&user)
db.Delete(&user)
gorm支持事务,不过是需要我们自己来简单的实现一些,假如说我们的事务是三步,我们要做的操作是:
// 开始事务
tx := db.Begin()
// 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
tx.Create(...)
// ...
// 遇到错误时回滚事务
tx.Rollback()
// 否则,提交事务
tx.Commit()
db.Transaction(func(tx *gorm.DB) error {
// 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
// 返回任何错误都会回滚事务
return err
}
if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
return err
}
// 返回 nil 提交事务
return nil
})
如果你的项目简单,没有使用事务的场景,可以在初始化时禁用它,这将获得大约 30%+ 性能提升。
// 全局禁用
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
SkipDefaultTransaction: true,
})
// 持续会话模式
tx := db.Session(&Session{SkipDefaultTransaction: true})
tx.First(&user, 1)
tx.Find(&users)
tx.Model(&user).Update("Age", 18)
GORM的知识就总结到这里吧,以后接触更多的再更新,你都学会(废)了吗?
* 本页内容参考以下数据源:
- https://gorm.io/
- https://www.jianshu.com/p/f1f9bbcff4dc
- https://my.oschina.net/tplinuxhyh/blog/4684067