Go语言加Vue3零基础入门全栈班11 Go语言+gorm用户管理系统实战 2024年08月03日 课程笔记

概述

如果您没有Golang的基础,应该学习如下前置课程。

  • Golang零基础入门
  • Golang面向对象编程
  • Go Web 基础
  • Go语言开发REST API接口_20240728
  • Go语言操作MySQL开发用户管理系统API教程_20240729
  • Redis零基础快速入门_20231227
  • Go+Redis开发用户管理系统API实战_20240730
  • MongoDB快速入门_20240411
  • Go语言+MongoDB用户管理系统实战_20240730
  • Go语言+gRPC用户微服务项目实战_20240730

基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相关知识点即可,遇到不会的知识点再看视频。

课程特色

本教程录制于2024年8月3日,使用Go1.22版本,基于Goland2024进行开发,采用的技术栈比较新。

每节课控制在十分钟以内,课时精简,每节课都是一个独立的知识点,如果有遗忘,完全可以当做字典来查询,绝不浪费大家的时间。

整个课程从如何连接MySQL讲起,讲解gorm的增删改查常见操作,然后结合REST API接口开发的知识,开发一个用户管理系统的后端API服务,层层递进,学习路径平缓。

Golang是当前国内越来越多的企业正在全面转的一门系统级别的高性能的编程语言,比C语言写法更加的简单,比Python性能更加的好,是新时代的C语言,建议每个程序员都掌握!

视频课程

最近发现越来越多的公司在用Golang了,所以精心整理了一套视频教程给大家,这个是其中的第11部,后续还会有很多。

视频已经录制完成,完整目录截图如下:
在这里插入图片描述

本套课程的特色是每节课都是一个核心知识点,每个视频控制在十分钟左右,精简不废话,拒绝浪费大家的时间。

课程目录

  • 01 概述
  • 02 连接MySQL数据库
  • 03 创建表
  • 04 新增数据
  • 05 查询数据
  • 06 修改数据
  • 07 删除数据
  • 08 zdpgo_gorm的介绍和使用
  • 09 事务的使用
  • 10 搭建项目的基本结构
  • 11 封装和使用初始化和关闭MySQL的方法
  • 12 创建和启动服务
  • 13 实现新增用户的接口并进行测试
  • 14 实现查询所有用户的接口并进行测试
  • 15 实现根据ID查询用户的接口并进行测试
  • 16 实现根据ID修改用户的接口并进行测试
  • 17 实现根据ID删除用户的接口并进行测试
  • 18 总结

完整代码

02 连接MySQL数据库

package main

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

func main() {
	db, err := gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)
}

03 创建表

package main

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})
}

04 新增数据

package main

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})

	user := User{11, "张三", 33}
	db.Create(&user)
}

05 查询数据

package main

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})

	var users []User
	db.Find(&users)
	fmt.Println(users)
}

06 修改数据

package main

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})

	db.Model(&User{Id: 11}).Update("name", "李四333")

	var users []User
	db.Find(&users)
	fmt.Println(users)
}

07 删除数据

package main

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})

	db.Delete(&User{Id: 11})

	var users []User
	db.Find(&users)
	fmt.Println(users)
}

08 zdpgo_gorm的介绍和使用

package main

import (
	"fmt"
	"github.com/zhangdapeng520/zdpgo_gorm"
	_ "github.com/zhangdapeng520/zdpgo_mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := zdpgo_gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})

	var users []User
	db.Find(&users)
	fmt.Println(users)
}

09 事务的使用

package main

import (
	"fmt"
	"github.com/zhangdapeng520/zdpgo_gorm"
	_ "github.com/zhangdapeng520/zdpgo_mysql"
)

type User struct {
	Id   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	db, err := zdpgo_gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)
	db.DB().SetMaxOpenConns(100)

	db.AutoMigrate(&User{})

	tx := db.Begin()

	u := User{Name: "赵六", Age: 18}
	err = tx.Create(&u).Error
	if err != nil {
		tx.Rollback()
		panic(err)
	}

	tx.Commit()

	var users []User
	db.Find(&users)
	fmt.Println(users)
}

11 封装和使用初始化和关闭MySQL的方法

package g

import (
	"github.com/zhangdapeng520/zdpgo_gorm"
	_ "github.com/zhangdapeng520/zdpgo_mysql"
	"gorm_api_user2/model"
)

var GDB *zdpgo_gorm.DB

func initMySQL() {
	var err error
	GDB, err = zdpgo_gorm.Open(
		"mysql",
		"root:root@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local",
	)
	if err != nil {
		panic(err)
	}

	GDB.DB().SetMaxIdleConns(10)
	GDB.DB().SetMaxOpenConns(100)

	GDB.AutoMigrate(&model.User{})
}

func closeMySQL() {
	GDB.Close()
}

12 创建和启动服务

package router

import "github.com/zhangdapeng520/zdpgo_httprouter"

func InitRouter() *zdpgo_httprouter.Router {
	router := zdpgo_httprouter.New()

	router.POST("/user", userAdd)
	router.GET("/user", userGetAll)
	router.GET("/user/:id", userGet)
	router.PUT("/user/:id", userUpdate)
	router.DELETE("/user/:id", userDelete)

	return router
}

package main

import (
	"gorm_api_user2/g"
	"gorm_api_user2/router"
	"net/http"
	"time"
)

func main() {
	g.InitGlobal()
	defer g.CloseGlobal()

	server := &http.Server{
		Addr:         ":8888",
		Handler:      router.InitRouter(),
		ReadTimeout:  5 * time.Second,
		WriteTimeout: 5 * time.Second,
	}
	server.ListenAndServe()
}

13 实现新增用户的接口并进行测试

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"gorm_api_user2/g"
	"gorm_api_user2/model"
	"net/http"
)

func userAdd(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
	var user model.User
	zdpgo_httprouter.GetJson(r, &user)

	g.GDB.Create(&user)

	zdpgo_httprouter.ResponseSuccess(w, user)
}

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"io"
	"os"
	"testing"
)

func TestUserAdd(t *testing.T) {
	targetUrl := "http://127.0.0.1:8888/user"
	data := map[string]interface{}{
		"name": "王五",
		"age":  30,
	}
	resp, err := zdpgo_httprouter.SendJson("POST", targetUrl, data)
	if err != nil {
		t.Error(err)
	}
	io.Copy(os.Stdout, resp.Body)
}

14 实现查询所有用户的接口并进行测试

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"gorm_api_user2/g"
	"gorm_api_user2/model"
	"net/http"
	"strconv"
)

func userGetAll(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {
	var users []model.User
	g.GDB.Find(&users)
	zdpgo_httprouter.ResponseSuccess(w, users)
}

func userGet(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {
	idStr := ps.ByName("id")
	id, _ := strconv.Atoi(idStr)

	var user model.User
	g.GDB.Find(&user, "id=?", id)

	zdpgo_httprouter.ResponseSuccess(w, user)
}

package router

import (
	"io"
	"net/http"
	"os"
	"testing"
)

func TestUserGetAll(t *testing.T) {
	targetUrl := "http://127.0.0.1:8888/user"
	resp, err := http.Get(targetUrl)
	if err != nil {
		t.Error(err)
	}
	io.Copy(os.Stdout, resp.Body)
}

func TestUserGet(t *testing.T) {
	targetUrl := "http://127.0.0.1:8888/user/4"
	resp, err := http.Get(targetUrl)
	if err != nil {
		t.Error(err)
	}
	io.Copy(os.Stdout, resp.Body)
}

16 实现根据ID修改用户的接口并进行测试

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"gorm_api_user2/g"
	"gorm_api_user2/model"
	"net/http"
	"strconv"
)

func userUpdate(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {
	idStr := ps.ByName("id")
	id, _ := strconv.Atoi(idStr)

	var user model.User
	zdpgo_httprouter.GetJson(r, &user)

	g.GDB.Model(model.User{Id: id}).Update("name", user.Name, "age", user.Age)

	zdpgo_httprouter.ResponseSuccess(w, nil)
}

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"io"
	"os"
	"testing"
)

func TestUserUpdate(t *testing.T) {
	targetUrl := "http://127.0.0.1:8888/user/4"
	data := map[string]interface{}{
		"name": "李四333",
		"age":  30,
	}
	resp, err := zdpgo_httprouter.SendJson("PUT", targetUrl, data)
	if err != nil {
		t.Error(err)
	}
	io.Copy(os.Stdout, resp.Body)
}

17 实现根据ID删除用户的接口并进行测试

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"gorm_api_user2/g"
	"gorm_api_user2/model"
	"net/http"
	"strconv"
)

func userDelete(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {
	idStr := ps.ByName("id")
	id, _ := strconv.Atoi(idStr)

	g.GDB.Delete(&model.User{Id: id})

	zdpgo_httprouter.ResponseSuccess(w, nil)
}

package router

import (
	"github.com/zhangdapeng520/zdpgo_httprouter"
	"io"
	"os"
	"testing"
)

func TestUserDelete(t *testing.T) {
	targetUrl := "http://127.0.0.1:8888/user/4"
	data := map[string]interface{}{}
	resp, err := zdpgo_httprouter.SendJson("DELETE", targetUrl, data)
	if err != nil {
		t.Error(err)
	}
	io.Copy(os.Stdout, resp.Body)
}

总结

整个课程从如何连接MySQL讲起,讲解gorm的增删改查常见操作,然后结合REST API接口开发的知识,开发一个用户管理系统的后端API服务,层层递进,学习路径平缓。

通过本套课程,能帮你入门Go语言加gorm框架开发后端REST API接口服务的技术。

如果您需要完整的源码,打赏20元即可。

人生苦短,我用PyGo,我是您身边的Python私教~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python私教

创业不易,请打赏支持我一点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值