目录
[01 01-gorm介绍](#01 01-gorm介绍)
[02 02-MySQL操作回顾](#02 02-MySQL操作回顾)
[03 03-gorm创建表](#03 03-gorm创建表)
[04 04-MySQL的init函数说明](#04 04-MySQL的init函数说明)
[05 05-gorm框架提供的MySQL连接池](#05 05-gorm框架提供的MySQL连接池)
[06 06-gorm插入数据](#06 06-gorm插入数据)
[07 07-gorm查询数据](#07 07-gorm查询数据)
[08 08-gorm更新数据](#08 08-gorm更新数据)
[09 09-gorm软删除-创建表](#09 09-gorm软删除-创建表)
[10 10-gorm软删除-实现](#10 10-gorm软删除-实现)
[11 10-MySQL的8小时时区问题](#11 10-MySQL的8小时时区问题)
[12 12-gorm实现创建表指定属性](#12 12-gorm实现创建表指定属性)
[13 13-初始化MySQL连接池-创建项目用表](#13 13-初始化MySQL连接池-创建项目用表)
01 gorm介绍

02 MySQL操作回顾
ORM 框架
ORM 框架介绍
- ORM:Object Relational Mapping ------ 对象关系映射。

-
作用:
-
通过操作结构体对象,来达到操作数据库表的目的。
-
通过结构体对象,来生成数据库表。
-
优点:
-
SQL有可能 比较复杂。(Oracle --- 子查询 -- 嵌套)ORM 操作数据库,不需要使用 SQL
-
不同开发者,书写的 SQL 语句执行效率不同。
-
go语言支持的 ORM:
-
xORM:
03 gorm创建表
gorm 连接数据库、建表
- grom 操作的都是表、表数据。------ 不能操作数据库!使用SQL配合完成。
```sql
create database 库名 charset=utf8;
```
回顾MySQL
-
确认mysql服务,启动:` ps xua | grep mysql`
-
连接MySQL数据库: mysql -uroot -p123456
-
查看数据库:show databases;
-
删除数据库:drop database t1; t1 代表库名。
-
选择数据库、查看表:use 数据库名; show tables;
-
创建数据库: create database test charset=utf8;
04 MySQL的init函数说明
gORM 操作 MySQL 数据库
创建表
- 连接数据库
```go
import (
_ "github.com/go-sql-driver/mysql" //"_" 代码不直接使用包, 底层链接要使用!
"fmt"
)
// mysql: 数据库的驱动名
// 链接数据库 --格式: 用户名:密码@协议(IP:port)/数据库名?xxx&yyy&
conn, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test")
if err != nil {
fmt.Println("gorm.Open err:",err)
return
}
defer conn.Close()
05 gorm框架提供的MySQL连接池
. 创建数据库表。 ------不能使用gorm创建数据库。 提前使用 SQL语句,创建好想要的数据库。
AutoMigrate() 创建表。默认创建的表 为 复数类型。------ 自动添加 "s"
在创建之前, 添加 ` conn.SingularTable(true)` 可以创建非复数表名的表。
```go
// 不要复数表名
conn.SingularTable(true)
// 借助 gorm 创建数据库表.
fmt.Println(conn.AutoMigrate(new(Student)).Error)
06 gorm插入数据
- 查看
```shell
mysql> desc student;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
```
07 gorm查询数据
MySQL 包的 init 方法
-
`_ "github.com/go-sql-driver/mysql"` 导入包时, "_" ,表示,驱使go系统,在main() 函数被调用之前,自动调用 init() 函数。
-
go语言中有两个特殊函数: ------ 首字母小写,包外可见 。
-
main() ------ 项目的入口函数
-
init() ------ 当导包,但没有在程序中使用。 在main() 调用之前,自动被调用。
-
查看:光标置于 MySQL包的 "mysql" 上。 使用 Ctrl-鼠标左键。 看到源码。 在 driver.go 底部包含 init() 函数的 定义。
-
init() 作用:实现注册 MySQL 驱动。
- 测试:
test2/ 中
```go
--- 创建 test2/ 目录, 在内部添加 init()
package test2
import "fmt"
// 首字母小写函数, 包作用域, 不能跨包使用!
func init() {
fmt.Println("测试 init 函数 ....")
}
```
test/ 中
```go
import (
_ "bj38web/web/test2" //"_" 代码不直接使用包, 底层链接要使用!
"fmt"
)
func main() {
fmt.Println("----this is main ---")
}
输出: 测试 init 函数 ....
再输出:----this is main ---
```
08 gorm更新数据
运行结果: init 函数 会先于 main() 函数被调用!!!
gorm的连接池
- ```go
-- 默认, grom框架创建好的MySQL数据库连接 conn ,就是一个连接池的句柄。
conn, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test")
```
- 初始化全局变量, 接收句柄
```go
// 创建全局连接池句柄
var GlobalConn *gorm.DB
GlobalConn = conn
```
09 gorm软删除-创建表
. 修改连接池初始属性
```go
// 初始数
GlobalConn.DB().SetMaxIdleConns(10)
// 最大数
GlobalConn.DB().SetMaxOpenConns(100)
```
- 使用连接池句柄
```go
--- 对比redis连接池:不需要使用 Get() 方法,取一条连接。
// 不要复数表名
GlobalConn.SingularTable(true)
// 借助 gorm 创建数据库表.
fmt.Println(GlobalConn.AutoMigrate(new(Student)).Error)
```
10 gorm软删除-实现
gorm 操作数据库数据
gorm 插入数据
```go
// insert into student(name, age) values('zhangsan', 100)
func InsertData() {
// 先创建数据 --- 创建对象
var stu Student
stu.Name = "zhangsan"
stu.Age = 100
// 插入(创建)数据
fmt.Println(GlobalConn.Create(&stu).Error)
}
```
11 MySQL的8小时时区问题
使用注意事项:
- 插入数据时,使用的 create() 函数,传参时,必须传入 &对象。 如果遗漏 "&" 会报错:

- 要保证 ,在插入数据库时,`GlobalConn.SingularTable(true)` 生效。代表不使用 复数表名。
12 gorm实现创建表指定属性
gorm 查询数据
简单查询方法:
- First(&suer):
- 获取 user 表中的第一条数据
```go
func SearchData() {
var stu Student
GlobalConn.First(&stu)
fmt.Println(stu)
}
```
-
相当于SQL:` SELECT * FROM student ORDER BY id LIMIT 1;`
-
只查询 name、age 不查询其他值:
```go
GlobalConn.Select("name, age").First(&stu)
```
13 初始化MySQL连接池-创建项目用表
- Last(&user)
-
获取 user 表中的最后一条数据
-
相当于SQL:` SELECT * FROM users ORDER BY id DESC LIMIT 1`
- Find(&user)
- 获取 user 表中的所有数据。
```go
var stu []Student // 改为切片
GlobalConn.Select("name, age").Find(&stu) // Find() 查询多条
```
- 相当于SQL:`select name, age from student;`