Go Gin+MySQL实现增删改查
一、概述
使用Gin框架+MySQL数据库实现增删改查(原生sql)
实现步骤:
1.导入Gin框架
go get -u github.com/gin-gonic/gin
2.引入MySQL驱动
go get -u github.com/go-sql-driver/mysql
3.注册Gin路由
// 注册用户路由 func RegisterUser() { //实例化一个路由 router := gin.Default() //注册增删改查路由 router.POST("/addUser", addUserHandler) router.GET("/getUsers", getUsersHandler) router.GET("/getUserById", getUserById) router.POST("/updateUser/:id", updateUserHandler) router.POST("/deleteUser", deleteUserHandler) router.Run(":8888") }
4.实现路由方法
以上路径后面就是路由需要实现的方法,如:addUserHandler
5.连接数据库
// 获取数据库连接对象 func getDB(info string) *sql.DB { sqlConnectStr := "root:123456@tcp(localhost:3306)/tony_cursor?charset=utf8&parseTime=true&loc=Local" SQLDB, err := sql.Open("mysql", sqlConnectStr) if err != nil { fmt.Println("数据库打开失败", err) // return } //测试与数据库建立的连接 err = SQLDB.Ping() if err != nil { fmt.Println("数据库连接失败", err) // return } else { fmt.Println("数据库连接成功") } // defer SQLDB.Close() fmt.Println(info) return SQLDB }
二、代码示例
1.添加用户
SQLDB := getDB("添加用户") //解析请求实体中的数据 var user User err1 := context.ShouldBindJSON(&user) fmt.Println("接收到用户请求的数据:", user) fmt.Println("创建时间:", user.CreateTime) if err1 != nil { //如果出错则返回错误信息 context.JSON(400, gin.H{ //说明是客户端传参有问题 "error": "Invalid request body"}) return } fmt.Println("开始执行sql") //执行插入操作并执行返回结果(执行原生sql语句) sql := "insert into user (name,pwd,head_img,phone,create_time) values (?,?,?,?,?)" fmt.Println(user.Name, user.Pwd, user.Phone, user.HeadImg, user.Phone, user.CreateTime) _, mErr := SQLDB.Exec(sql, user.Name, user.Pwd, user.HeadImg, user.Phone, user.CreateTime) if mErr != nil { //说明是服务端出现异常 context.JSON(500, gin.H{ "error": "Failed to create user" + mErr.Error()}) fmt.Println(mErr) return } fmt.Println("sql执行完成开始给客户端返回正确结果") //如果都没有问题则返回200 context.JSON(200, gin.H{ "message": "User created successfully"})
2.获取用户列表
SQLDB := getDB("查询用户列表") rows, err := SQLDB.Query("select id,name,head_img,phone,create_time from user") if err != nil { context.JSON(500, gin.H{ "error": err.Error()}) return } defer rows.Close() //解析查询结果并返回json形式的用户列表 users := []User{} for rows.Next() { var user User err1 := rows.Scan(&user.Id, &user.Name, &user.HeadImg, &user.Phone, &user.CreateTime) if err1 != nil { context.JSON(500, gin.H{ "error": err1.Error()}) return } users = append(users, user) } context.JSON(200, gin.H{ "data": users})
3.通过用户id获取特定用户
SQLDB := getDB("根据用户id查询用户") id := context.Query("id") //这里指的是接受param中的参数 fmt.Println("用户id:", id) row := SQLDB.QueryRow("select id,name,head_img,phone,create_time from user where id=?", id) if row.Err() != nil { context.JSON(500, gin.H{"error": row.Err().Error()}) return } var user User err := row.Scan(&user.Id, &user.Name, &user.HeadImg, &user.Phone, &user.CreateTime) if err != nil { context.JSON(500, gin.H{"error": err.Error()}) return } context.JSON(200, gin.H{"data": user})
4.根据用户id修改指定用户
SQLDB := getDB("更新用户信息") var id string = context.Param("id") //从请求的url中获取参数(restfull) var user User err2 := context.ShouldBindJSON(&user) //接收请求参数(json格式的) if err2 != nil { context.JSON(400, gin.H{ "error": err2.Error()}) return } ret, err1 := SQLDB.Exec("update user set name=? where id=?", user.Name, id) if err1 != nil { context.JSON(500, gin.H{ "error": err1.Error()}) return } mId, err3 := ret.LastInsertId() if err3 != nil { context.JSON(500, gin.H{"error": err3.Error()}) return } context.JSON(200, gin.H{"data": mId})
5.根据用户id逻辑删除指定指定用户
SQLDB := getDB("删除用户信息") var user User err := context.ShouldBindJSON(&user) if err != nil { context.JSON(400, gin.H{"error": err.Error()}) return } _, err1 := SQLDB.Exec("update user set deleted=1 where id=?", user.Id) if err1 != nil { context.JSON(500, gin.H{"error": err1.Error()}) return } context.JSON(200, gin.H{"data": "delete user successfuly"})
6.对用户表进行增删改查完整代码
package controller import ( "database/sql" "fmt" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" ) // 用户实体 type User struct { Id int64 `json:"id"` Name string `json:"name"` Pwd string `json:"pwd"` HeadImg string `json:"head_img"` Phone string `json:"phone"` CreateTime string `json:"create_time"` UpdateTime string `json:"update_time"` Sort int `json:"sort"` CreateUser int64 `json:"create_user"` UpdateUser int64 `json:"update_user"` Deleted int `json:"deleted"` } // 注册用户路由 func RegisterUser() { //实例化一个路由 router := gin.Default() //注册增删改查路由 router.POST("/addUser", addUserHandler) router.GET("/getUsers", getUsersHandler) router.GET("/getUserById", getUserById) router.POST("/updateUser/:id", updateUserHandler) router.POST("/deleteUser", deleteUserHandler) router.Run(":8888") } // 添加新用户 func addUserHandler(context *gin.Context) { SQLDB := getDB("添加用户") //解析请求实体中的数据 var user User err1 := context.ShouldBindJSON(&user) fmt.Println("接收到用户请求的数据:", user) fmt.Println("创建时间:", user.CreateTime) if err1 != nil { //如果出错则返回错误信息 context.JSON(400, gin.H{ //说明是客户端传参有问题 "error": "Invalid request body"}) return } fmt.Println("开始执行sql") //执行插入操作并执行返回结果(执行原生sql语句) sql := "insert into user (name,pwd,head_img,phone,create_time) values (?,?,?,?,?)" fmt.Println(user.Name, user.Pwd, user.Phone, user.HeadImg, user.Phone, user.CreateTime) _, mErr := SQLDB.Exec(sql, user.Name, user.Pwd, user.HeadImg, user.Phone, user.CreateTime) if mErr != nil { //说明是服务端出现异常 context.JSON(500, gin.H{ "error": "Failed to create user" + mErr.Error()}) fmt.Println(mErr) return } fmt.Println("sql执行完成开始给客户端返回正确结果") //如果都没有问题则返回200 context.JSON(200, gin.H{ "message": "User created successfully"}) } // 获取用户列表 func getUsersHandler(context *gin.Context) { SQLDB := getDB("查询用户列表") rows, err := SQLDB.Query("select id,name,head_img,phone,create_time from user") if err != nil { context.JSON(500, gin.H{ "error": err.Error()}) return } defer rows.Close() //解析查询结果并返回json形式的用户列表 users := []User{} for rows.Next() { var user User err1 := rows.Scan(&user.Id, &user.Name, &user.HeadImg, &user.Phone, &user.CreateTime) if err1 != nil { context.JSON(500, gin.H{ "error": err1.Error()}) return } users = append(users, user) } context.JSON(200, gin.H{ "data": users}) } func getUserById(context *gin.Context) { SQLDB := getDB("查询用户列表") id := context.Query("id") //这里指的是接受param中的参数 fmt.Println("用户id:", id) row := SQLDB.QueryRow("select id,name,head_img,phone,create_time from user where id=?", id) if row.Err() != nil { context.JSON(500, gin.H{"error": row.Err().Error()}) return } var user User err := row.Scan(&user.Id, &user.Name, &user.HeadImg, &user.Phone, &user.CreateTime) if err != nil { context.JSON(500, gin.H{"error": err.Error()}) return } context.JSON(200, gin.H{"data": user}) } // 更新用户信息 func updateUserHandler(context *gin.Context) { SQLDB := getDB("更新用户信息") var id string = context.Param("id") //从请求的url中获取参数(restfull) var user User err2 := context.ShouldBindJSON(&user) //接收请求参数(json格式的) if err2 != nil { context.JSON(400, gin.H{ "error": err2.Error()}) return } ret, err1 := SQLDB.Exec("update user set name=? where id=?", user.Name, id) if err1 != nil { context.JSON(500, gin.H{ "error": err1.Error()}) return } mId, err3 := ret.LastInsertId() if err3 != nil { context.JSON(500, gin.H{"error": err3.Error()}) return } context.JSON(200, gin.H{"data": mId}) } // 删除用户 func deleteUserHandler(context *gin.Context) { SQLDB := getDB("删除用户信息") var user User err := context.ShouldBindJSON(&user) if err != nil { context.JSON(400, gin.H{"error": err.Error()}) return } _, err1 := SQLDB.Exec("update user set deleted=1 where id=?", user.Id) if err1 != nil { context.JSON(500, gin.H{"error": err1.Error()}) return } context.JSON(200, gin.H{"data": "delete user successfuly"}) } // 获取数据库连接对象 func getDB(info string) *sql.DB { sqlConnectStr := "root:123456@tcp(localhost:3306)/tony_cursor?charset=utf8&parseTime=true&loc=Local" SQLDB, err := sql.Open("mysql", sqlConnectStr) if err != nil { fmt.Println("数据库打开失败", err) // return } //测试与数据库建立的连接 err = SQLDB.Ping() if err != nil { fmt.Println("数据库连接失败", err) // return } else { fmt.Println("数据库连接成功") } // defer SQLDB.Close() fmt.Println(info) return SQLDB }
7.使用
// GinTest.go package main import ( "fmt" "go_workspace/controller" ) func main() { controller.RegisterUser() fmt.Println("Hello World!") }
8.完结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
2014-01-10 OpenCV开发环境搭建-并测试一个图像灰度处理程序
2014-01-10 Android GridView使用View.GONE只隐藏内容而不隐藏空间的解决方案