前言
作为服务的提供者,那么必不可少的就是对数据库以及一些中间件的操作,保证前端可以稳定的从后端获取想要的数据,那么今天我们就来了解一下go语言对数据库的一些操作,这里使用mysql为例
引入依赖,加载驱动
对数据库进行操作,那么必不可少的一定是依赖了,就如同java操作数据库一定要有数据库的驱动一样,go语言也需要
import (
// 加载数据库驱动
_ "github.com/go-sql-driver/mysql"
)
开启连接
db, err := sql.Open("mysql", "root:@tcp(localhost:3306)/hb_shop")
if err != nil {
// 连接出错,直接panic,从这里直接退出了
panic(err)
}
defer func() {
db.Close()
}()
// 这里才是真正的开启连接
db.Ping()
预编译,执行sql
我们所有的sql语句都走预编译,避免sql注入
1、查询
query, err := db.Prepare("select * from hb_user where id = ?")
// 一定要关闭资源
defer func() {
if stm != nil {
stm.Close()
}
}()
if err != nil {
panic("预处理失败")
}
row := stm.QueryRow(1)
var u User
row.Scan(&u.Username)
// 多结果处理,这里没有处理err
rows,err := stm.Query(1)
//循环遍历结果
for rows.Next() {
var u User
//分别赋值
rows.Scan(&u.Username)
}
2、新增
// 新增
insert, err := db.Prepare("insert into hb_user values (?,?,?,?)")
res, err := insert.Exec(1, 1, 1, 1)
id, _ := res.LastInsertId()
3、修改
// 修改
update, err := db.Prepare("update hb_user set username = ? where id = ?")
updateRes,_ :=update.Exec(1, 2)
// count 是获取的影响的行数
count,_ := updateRes.RowsAffected()
4、删除
删除与修改的执行是一致的,实际上沃恩在做删除操作时使用的是逻辑删除
del, err := db.Prepare("delete from hb_user where id = ?")
delRes,_ :=update.Exec( 2)
// count 是获取的影响的行数
count,_ := delRes.RowsAffected()
完整代码
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
Username string `json:"username"`
}
func main() {
db, err := sql.Open("mysql", "root:@tcp(localhost:3306)/hb_shop")
if err != nil {
// 连接出错,直接panic
panic(err)
}
defer func() {
db.Close()
}()
// 这里才是真正的开启连接
db.Ping()
// 查询
query := "select * from hb_user where id = ?"
stm, err := db.Prepare(query)
// 一定要关闭资源
defer func() {
if stm != nil {
stm.Close()
}
}()
if err != nil {
panic("预处理失败")
}
row := stm.QueryRow(1)
var u User
row.Scan(&u.Username)
// 新增
insert, err := db.Prepare("insert into hb_user values (?,?,?,?)")
res, err := insert.Exec(1, 1, 1, 1)
id, _ := res.LastInsertId()
// 修改
update, err := db.Prepare("update hb_user set username = ? where id = ?")
updateRes, _ := update.Exec(1, 2)
count, _ := updateRes.RowsAffected()
fmt.Print(id)
fmt.Print(u)
}
注意
- 有异常一定要关闭资源
- 可以直接抛出panic