1. 连接数据库.Connect()
| package my_db |
| |
| import ( |
| "fmt" |
| _ "github.com/go-sql-driver/mysql" |
| "github.com/jmoiron/sqlx" |
| ) |
| var DbName *sqlx.DB |
| |
| func InitDB() (err error) { |
| DbName,_ =sqlx.Connect("mysql","root:40010355@(127.0.0.1:3306)/liubeidb") |
| |
| if err != nil { |
| fmt.Printf("connect DB failed, err:%v\n", err) |
| return |
| } |
| DbName.SetMaxOpenConns(20) |
| DbName.SetMaxIdleConns(10) |
| fmt.Printf("connect DB success\n") |
| return |
| } |
| db.SetMaxOpenConns(20) 最大打开连接数 |
| db.SetMaxIdleConns(10) 闲时最大连接数 |
2. 查询
2.1 单行查询.Get()
1)在my_db目录下创建user.go文件内容如下:
| package my_db |
| |
| import ( |
| "fmt" |
| _ "github.com/go-sql-driver/mysql" |
| ) |
| |
| type userTab struct { |
| Id int `json:"id"` |
| Name string `json:"name"` |
| Age int `json:"age"` |
| } |
| |
| var UserInfo userTab |
| |
| func QueryRowDemo(id int) userTab{ |
| sqlStr := "select id, name, age from user where id=?" |
| err := DbName.Get(&UserInfo, sqlStr, id) |
| if err != nil { |
| fmt.Printf("get failed, err:%v\n", err) |
| |
| } |
| fmt.Printf("id:%d name:%s age:%d\n", UserInfo.Id, UserInfo.Name, UserInfo.Age) |
| return UserInfo |
| } |
以下,用gin写一个接口,用于查看结果(非必要)
2)创建路由
| package http |
| |
| import ( |
| "fmt" |
| "github.com/gin-gonic/gin" |
| ) |
| |
| func ConfigRoutes() { |
| r := gin.Default() |
| |
| v1 := r.Group("/v1") |
| { |
| v1.GET("/login", login) |
| v1.GET("submit", submit) |
| v1.GET("/mysql/select", mysqlSelect) |
| } |
| |
| r.Run(":1840") |
| } |
3)context
| package http |
| |
| import ( |
| "github.com/gin-gonic/gin" |
| "testmysql/my_db" |
| ) |
| |
| func mysqlSelect(c *gin.Context) { |
| msg := my_db.QueryRowDemo(1) |
| c.JSON(200, msg) |
| } |
4)查看结果

2.2 多行查询.Select()
1)user.go文件添加内容如下:
| func QueryMultiRowDemo() []userTab{ |
| sqlStr := "select id, name, age from user where id > ?" |
| var usersInfo []userTab |
| err := DbName.Select(&usersInfo, sqlStr, 0) |
| if err != nil { |
| fmt.Printf("query failed, err:%v\n", err) |
| } |
| fmt.Printf("users:%#v\n", usersInfo) |
| return usersInfo |
| } |
以下利用gin 写一个路由,仅为查看,非连接数据库必须:
2)contect
| func mysqlSelects(c *gin.Context) { |
| msg := my_db.QueryMultiRowDemo() |
| c.JSON(200, msg) |
| } |
3)v1中添加一条路由如下:
| v1.GET("/mysql/selects", mysqlSelects) |
4)查看

3. 插入.Exec()
| func InsertRowDemo(name string,age int) { |
| sqlStr := "insert into user(name, age) values (?,?)" |
| _, err := DbName.Exec(sqlStr, name,age) |
| if err != nil { |
| fmt.Printf("insert failed, err:%v\n", err) |
| return |
| } |
| fmt.Printf("insert success, the name is %d.\n", name) |
| } |
4. 删除.Exec()
| func DeleteRowDemo(id int) string{ |
| sqlStr := "delete from user where id = ?" |
| ret, err := DbName.Exec(sqlStr, id) |
| if err != nil { |
| |
| return err.Error() |
| } |
| n, err := ret.RowsAffected() |
| if err != nil { |
| |
| return err.Error() |
| } |
| return "delete success, affected rows:"+string(n) |
| } |
| func mysqlDelete(c *gin.Context) { |
| msg := my_db.DeleteRowDemo(6) |
| c.JSON(200, msg) |
| } |
| |
| |
| func ConfigRoutes() { |
| |
| |
| r := gin.Default() |
| |
| |
| |
| v1 := r.Group("/v1") |
| { |
| ...... |
| v1.GET("/mysql/delete", mysqlDelete) |
| } |
| ...... |
| } |
- 成功删除,输出结果如下

5. 更新.Exec()
| func UpdateRowDemo(age int,id int) { |
| sqlStr := "update user set age=? where id = ?" |
| ret, err := DbName.Exec(sqlStr, age, id) |
| if err != nil { |
| fmt.Printf("update failed, err:%v\n", err) |
| return |
| } |
| n, err := ret.RowsAffected() |
| if err != nil { |
| fmt.Printf("get RowsAffected failed, err:%v\n", err) |
| return |
| } |
| fmt.Printf("update success, affected rows:%d\n", n) |
| } |
我们不能再从外部传入变量,小心sql注入。
| func main() { |
| my_db.InitDB() |
| my_db.UpdateRowDemo(20,5) |
| } |
6. 事务
6.1 开始事务.Begin()
6.2 提交事务.Commit()
6.3 回滚.Rollback()
| func TransactionDemo() { |
| tx, err := DBName.Begin() |
| if err != nil { |
| if tx != nil { |
| tx.Rollback() |
| } |
| fmt.Printf("begin trans failed, err:%v\n", err) |
| return |
| } |
| sqlStr1 := "Update user set age=18 where id=?" |
| _, err = tx.Exec(sqlStr1, 4) |
| if err != nil { |
| tx.Rollback() |
| fmt.Printf("exec sql1 failed, err:%v\n", err) |
| return |
| } |
| sqlStr2 := "Update user set age=19 where id=?" |
| _, err = tx.Exec(sqlStr2, 5) |
| if err != nil { |
| tx.Rollback() |
| fmt.Printf("exec sql2 failed, err:%v\n", err) |
| return |
| } |
| err = tx.Commit() |
| if err != nil { |
| tx.Rollback() |
| fmt.Printf("commit failed, err:%v\n", err) |
| return |
| } |
| fmt.Println("exec trans success!") |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具