C++GO语言微服务之gorm框架操作MySQL

目录

[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 ------ 对象关系映射。

![1582249051388](课本笔记-06.assets/1582249051388.png)

  • 作用:

  • 通过操作结构体对象,来达到操作数据库表的目的。

  • 通过结构体对象,来生成数据库表。

  • 优点:

  • SQL有可能 比较复杂。(Oracle --- 子查询 -- 嵌套)ORM 操作数据库,不需要使用 SQL

  • 不同开发者,书写的 SQL 语句执行效率不同。

  • go语言支持的 ORM:

  • gORM:http://gorm.book.jasperxu.com/

  • xORM:

03 gorm创建表

gorm 连接数据库、建表

  • grom 操作的都是表、表数据。------ 不能操作数据库!使用SQL配合完成。

```sql

create database 库名 charset=utf8;

```

回顾MySQL

  1. 确认mysql服务,启动:` ps xua | grep mysql`

  2. 连接MySQL数据库: mysql -uroot -p123456

  3. 查看数据库:show databases;

  4. 删除数据库:drop database t1; t1 代表库名。

  5. 选择数据库、查看表:use 数据库名; show tables;

  6. 创建数据库: create database test charset=utf8;

04 MySQL的init函数说明

gORM 操作 MySQL 数据库

创建表

  1. 连接数据库

```go

import (

"github.com/jinzhu/gorm"

_ "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插入数据

  1. 查看

```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 方法

  1. `_ "github.com/go-sql-driver/mysql"` 导入包时, "_" ,表示,驱使go系统,在main() 函数被调用之前,自动调用 init() 函数。

  2. go语言中有两个特殊函数: ------ 首字母小写,包外可见 。

  3. main() ------ 项目的入口函数

  4. init() ------ 当导包,但没有在程序中使用。 在main() 调用之前,自动被调用。

  • 查看:光标置于 MySQL包的 "mysql" 上。 使用 Ctrl-鼠标左键。 看到源码。 在 driver.go 底部包含 init() 函数的 定义。

  • init() 作用:实现注册 MySQL 驱动。

  1. 测试:

test2/ 中

```go

--- 创建 test2/ 目录, 在内部添加 init()

package test2

import "fmt"

// 首字母小写函数, 包作用域, 不能跨包使用!

func init() {

fmt.Println("测试 init 函数 ....")

}

```

test/ 中

```go

import (

"github.com/jinzhu/gorm"

_ "bj38web/web/test2" //"_" 代码不直接使用包, 底层链接要使用!

"fmt"

)

func main() {

fmt.Println("----this is main ---")

}

输出: 测试 init 函数 ....

再输出:----this is main ---

```

08 gorm更新数据

运行结果: init 函数 会先于 main() 函数被调用!!!

gorm的连接池

  1. ```go

-- 默认, grom框架创建好的MySQL数据库连接 conn ,就是一个连接池的句柄。

conn, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test")

```

  1. 初始化全局变量, 接收句柄

```go

// 创建全局连接池句柄

var GlobalConn *gorm.DB

GlobalConn = conn

```

09 gorm软删除-创建表

. 修改连接池初始属性

```go

// 初始数

GlobalConn.DB().SetMaxIdleConns(10)

// 最大数

GlobalConn.DB().SetMaxOpenConns(100)

```

  1. 使用连接池句柄

```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() 函数,传参时,必须传入 &对象。 如果遗漏 "&" 会报错:

![1582255572530](课本笔记-06.assets/1582255572530.png)

  • 要保证 ,在插入数据库时,`GlobalConn.SingularTable(true)` 生效。代表不使用 复数表名。

12 gorm实现创建表指定属性

gorm 查询数据

简单查询方法:

  1. 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连接池-创建项目用表

  1. Last(&user)
  • 获取 user 表中的最后一条数据

  • 相当于SQL:` SELECT * FROM users ORDER BY id DESC LIMIT 1`

  1. Find(&user)
  • 获取 user 表中的所有数据。

```go

var stu []Student // 改为切片

GlobalConn.Select("name, age").Find(&stu) // Find() 查询多条

```

  • 相当于SQL:`select name, age from student;`
相关推荐
爱吃烤鸡翅的酸菜鱼8 分钟前
Java【网络原理】(5)深入浅出HTTPS:状态码与SSL/TLS加密全解析
java·网络·后端·网络协议·http·https·ssl
yorushika_16 分钟前
python打卡训练营打卡记录day22
开发语言·python·机器学习
黑风风22 分钟前
在 Ubuntu 上安装并运行 ddns-go 教程
linux·ubuntu·golang
帕米尔的鸢25 分钟前
golang-ErrGroup用法以及源码解读笔记
golang
Ronin30529 分钟前
【C++】16.继承
开发语言·c++
qq_4335545429 分钟前
C++ string初始化、string赋值操作、string拼接操作
开发语言·c++·算法
途中刂35 分钟前
第一章 初识Java
java·开发语言·笔记·学习·intellij-idea
CodeWithMe1 小时前
【C/C++】跟我一起学_C++同步机制效率对比与优化策略
c语言·c++
有梦想的攻城狮1 小时前
spring中的@Qualifier注解详解
java·后端·spring·注解·qualifier
终焉代码1 小时前
C++入门篇——类和对象(下)
开发语言·c++·算法