广告位联系
返回顶部
分享到

Go使用Gin+mysql实现增删改查的详细实例

Golang 来源:互联网 作者:佚名 发布时间:2022-12-04 11:01:52 人浏览
摘要

0.前置知识 Go中的struct。 mysql、Gin框架。 Web基础。 1.架构 使用mysql作为数据库,Gin作为Web框架。 2.功能模块 1.自定义Person结构体 2.实现对Person的增删改查。 根据id查询或查询所有 插入

0.前置知识

  • Go中的struct。
  • mysql、Gin框架。
  • Web基础。

1.架构

使用mysql作为数据库,Gin作为Web框架。

2.功能模块

1.自定义Person结构体

2.实现对Person的增删改查。

  • 根据id查询或查询所有
  • 插入
  • 修改
  • 删除

3.实现流程

1.建立数据库连接池db,然后连接指定的数据库。

2.编写Web接口(增删改查)

3.通过postman测试或者直接网页请求测试。

4.代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

package main

 

// 导入模块

import (

    "bytes"

    "database/sql"

    "fmt"

    "github.com/gin-gonic/gin"

    _ "github.com/go-sql-driver/mysql"

    "log"

    "net/http"

    "strconv"

)

 

 

var db *sql.DB

 

// Person 自定义Person类

type Person struct {

    Id        int    `json:"id"`

    FirstName string `json:"first_name" form:"first_name"`

    LastName  string `json:"last_name" form:"last_name"`

}

 

func (p *Person) get(db *sql.DB) (person Person, err error) {

    row := db.QueryRow("SELECT id,first_name,last_name from person where id=?", p.Id)

    err = row.Scan(&person.Id, &person.FirstName, &person.LastName)

    if err != nil {

        return

    }

    return

}

 

func (p *Person) getAll(db *sql.DB) (persons []Person, err error) {

    rows, err := db.Query("select id,first_name,last_name from person")

    fmt.Println(rows)

    if err != nil {

        return

    }

    for rows.Next() {

        var person Person

        rows.Scan(&person.Id, &person.FirstName, &person.LastName)

        persons = append(persons, person)

    }

    defer rows.Close()

    return

}

 

func (p *Person) add(db *sql.DB) (Id int, err error) {

    stmt, err := db.Prepare("INSERT into person(first_name,last_name) values (?,?)")

    if err != nil {

        return

    }

    rs, err := stmt.Exec(p.FirstName, p.LastName)

    if err != nil {

        return

    }

    id, err := rs.LastInsertId()

    if err != nil {

        log.Fatalln(err)

    }

    Id = int(id)

    defer stmt.Close()

    return

}

 

func (p *Person) update(db *sql.DB) (rows int, err error) {

    stmt, err := db.Prepare("update person set first_name=?,last_name=? where id=?")

    if err != nil {

        log.Fatalln(err)

    }

    rs, err := stmt.Exec(p.FirstName, p.LastName, p.Id)

    if err != nil {

        log.Fatalln(err)

    }

    row, err := rs.RowsAffected()

    if err != nil {

        log.Fatalln(err)

    }

    rows = int(row)

    defer stmt.Close()

    return

}

 

func (p *Person) del(db *sql.DB) (rows int, err error) {

    stmt, err := db.Prepare("delete from person where id=?")

    if err != nil {

        log.Fatalln(err)

    }

    rs, err := stmt.Exec(p.Id)

    if err != nil {

        log.Fatalln(err)

    }

    row, err := rs.RowsAffected()

    if err != nil {

        log.Fatalln(err)

    }

    rows = int(row)

    defer stmt.Close()

    return

}

 

func test(db *sql.DB) {

    rows, err := db.Query("select * from person")

    if err != nil {

        return

    }

    defer rows.Close()

    var persons []Person

    for rows.Next() {

        var person Person

        rows.Scan(&person.Id, &person.FirstName, &person.LastName)

        persons = append(persons, person)

    }

    fmt.Println(persons)

}

func main() {

    var err error

    db, err := sql.Open("mysql", "root:xxxxx@tcp(127.0.0.1:3306)/go_project01?parseTime=true")

    if err != nil {

        log.Fatal(err.Error())

    }

    //defer db.Close()

    err = db.Ping()

    if err != nil {

        log.Fatal(err.Error())

    }

    //test(db)

    //创建路由引擎

    router := gin.Default()

 

    //查询,返回所有对象和对象个数

    router.GET("/persons", func(context *gin.Context) {

        p := Person{}

        persons, err := p.getAll(db)

        if err != nil {

            log.Fatalln(err)

        }

        context.JSON(http.StatusOK, gin.H{

            "result": persons,

            "count":  len(persons),

        })

    })

    //根据id查询

    router.GET("/person/:id", func(context *gin.Context) {

        var result gin.H

        id := context.Param("id")

 

        Id, err := strconv.Atoi(id)

        if err != nil {

            log.Fatalln(err)

        }

        p := Person{

            Id: Id,

        }

        person, err := p.get(db)

        if err != nil {

            result = gin.H{

                "result": nil,

                "count":  0,

            }

        } else {

            result = gin.H{

                "result": person,

                "count":  1,

            }

        }

        context.JSON(http.StatusOK, result)

    })

    //创建person

    router.POST("/person", func(context *gin.Context) {

        var p Person

        err := context.Bind(&p)

        if err != nil {

            log.Fatalln(err)

        }

 

        Id, err := p.add(db)

        if err != nil {

            log.Fatalln(err)

        }

        fmt.Println(Id)

        name := p.FirstName + " " + p.LastName

        context.JSON(http.StatusOK, gin.H{

            "message": fmt.Sprintf(" %s 成功创建", name),

        })

    })

    //更新update

    router.PUT("/person/:id", func(context *gin.Context) {

        var (

            p      Person

            buffer bytes.Buffer

        )

 

        id := context.Param("id")

        Id, err := strconv.Atoi(id)

        if err != nil {

            log.Fatalln(err)

        }

        err = context.Bind(&p)

        if err != nil {

            log.Fatalln(err)

        }

        p.Id = Id

        rows, err := p.update(db)

        if err != nil {

            log.Fatalln(err)

        }

        fmt.Println(rows)

        buffer.WriteString(p.FirstName)

        buffer.WriteString(" ")

        buffer.WriteString(p.LastName)

        name := buffer.String()

 

        context.JSON(http.StatusOK, gin.H{

            "message": fmt.Sprintf("成功更新到%s", name),

        })

    })

    //删除person

    router.DELETE("/person/:id", func(context *gin.Context) {

        id := context.Param("id")

 

        Id, err := strconv.ParseInt(id, 10, 10)

        if err != nil {

            log.Fatalln(err)

        }

        p := Person{Id: int(Id)}

        rows, err := p.del(db)

        if err != nil {

            log.Fatalln(err)

        }

        fmt.Println("delete rows: ", rows)

 

        context.JSON(http.StatusOK, gin.H{

            "message": fmt.Sprintf("成功删除用户:%s", id),

        })

    })

    router.Run(":8080")

}

5.结果


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/weixin_45750972/article/details/127112887
相关文章
  • go语言题解LeetCode228汇总区间介绍
    原题链接 : 228. 汇总区间 给定一个 无重复元素的有序整数数组nums。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,
  • Go使用Gin+mysql实现增删改查的详细实例

    Go使用Gin+mysql实现增删改查的详细实例
    0.前置知识 Go中的struct。 mysql、Gin框架。 Web基础。 1.架构 使用mysql作为数据库,Gin作为Web框架。 2.功能模块 1.自定义Person结构体 2.实现对P
  • 浅析Go语言中数组的这些细节
    Go语言基础二 lencap 书接上文,我们提到二维数组中的第二个维度的数组不能用...来表示,接下来我们要认识两个新的函数,它们分别是len和
  • Go1.20 arena新特性介绍

    Go1.20 arena新特性介绍
    当时我们还想着 Go 团队应该不会接纳,至少不会那么快: 懒得翻也可以看我再次道来,本文提到的提案《proposal: arena: new package providing me
  • Go map发生内存泄漏解决方法
    Go 程序运行时,有些场景下会导致进程进入某个高点,然后就再也下不来了。 比如,多年前曹大写过的一篇文章讲过,在做活动时线上涌入
  • Go语言实现栈与队列基本操作学家

    Go语言实现栈与队列基本操作学家
    go语言中,并没有栈与队列相关的数据结构,但是我们可以借助切片来实现栈与队列的操作;接下来我们一起实现栈与队列基本操作,并且还
  • Golang内存模型The Go Memory Model
    本文翻译了原文并加入了自己的理解。 主要介绍多个 Go协程之间对同一个变量并发读写时需要注意的同步措施和执行顺序问题。并列出几个
  • Golang源码分析之golang/sync之singleflight

    Golang源码分析之golang/sync之singleflight
    1.1. 项目介绍 golang/sync库拓展了官方自带的sync库,提供了errgroup、semaphore、singleflight及syncmap四个包,本次分析singlefliht的源代码。 singleflih
  • 教你如何优雅处理Golang中的异常
    我们在使用Golang时,不可避免会遇到异常情况的处理,与Java、Python等语言不同的是,Go中并没有try...catch...这样的语句块,我们知道在Java中
  • Go语言k8s kubernetes使用leader election实现选举

    Go语言k8s kubernetes使用leader election实现选举
    在kubernetes的世界中,很多组件仅仅需要一个实例在运行,比如controller-manager或第三方的controller,但是为了高可用性,需要组件有多个副本,
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计