采编于 https://www.jianshu.com/p/ee87e989f149
经过几个视频教程学习和搜索结果,在Golang中使用https://github.com/go-sql-driver/mysql来访问数据库。
安装方法
go get github.com/go-sql-driver/mysq
使用方法
import "database/sql"
import _ "github.com/go-sql-driver/mysql"
mysql数据库连接
- 构建连接, 格式是:"用户名:密码@tcp(IP:端口)/数据库?charset=utf8"
- 打开数据库,前者是驱动名,所以要导入: _ "github.com/go-sql-driver/mysql"
- 设置数据库最大连接数和设置上数据库最大闲置连接数
- 验证连接:使用Ping()函数
代码如下:
//数据库配置
const (
userName = "root"
password = "123456"
ip = "127.0.0.1"
port = "3306"
dbName = "guns"
)
//Db数据库连接池
var DB *sql.DB
//注意方法名大写,就是public
func InitDB() {
//构建连接:"用户名:密码@tcp(IP:端口)/数据库?charset=utf8"
path := strings.Join([]string{userName, ":", password, "@tcp(", ip, ":", port, ")/", dbName, "?charset=utf8"}, "")
//打开数据库,前者是驱动名,所以要导入: _ "github.com/go-sql-driver/mysql"
DB, _ = sql.Open("mysql", path)
//设置数据库最大连接数
DB.SetConnMaxLifetime(100)
//设置上数据库最大闲置连接数
DB.SetMaxIdleConns(10)
//验证连接
if err := DB.Ping(); err != nil {
fmt.Println("opon database fail")
return
}
fmt.Println("connnect success")
}
insert
步骤:
- 开启事务: tx, err := DB.Begin()
- 准备sql语句:stmt, err := tx.Prepare("INSERT INTO nk_user (
name
,password
) VALUES (?, ?)") - 执行sql语句:res, err := stmt.Exec(user.UserName, user.Password)
- 提交事务: tx.Commit()
- 获得上一个插入自增的id: res.LastInsertId()
//插入数据代码如下
func InsertUser(username string, password string) bool {
//开启事务
tx, err := DB.Begin()
if err != nil {
fmt.Println("tx fail")
return false
}
//准备sql语句
stmt, err := tx.Prepare("INSERT INTO nk_user (name,password) VALUES (?,?)")
if err != nil {
fmt.Println("Prepare fail")
return false
}
//将参数传递到sql语句中并且执行
res, err := stmt.Exec(username, password)
if err != nil {
fmt.Println("Exec fail")
return false
}
//将事务提交
tx.Commit()
//获得上一个插入自增的id
fmt.Println(res.LastInsertId())
return true
}
delete
步骤:
- 开启事务: tx, err := DB.Begin()
- 准备sql语句:stmt, err := tx.Prepare("DELETE FROM nk_user WHERE id = ?")
- 执行sql语句:res, err := stmt.Exec(user.Id)
- 提交事务: tx.Commit()
//删除代码如下:
func DeleteUser(userid int) (bool) {
//开启事务
tx, err := DB.Begin()
if err != nil{
fmt.Println("tx fail")
}
//准备sql语句
stmt, err := tx.Prepare("DELETE FROM nk_user WHERE id = ?")
if err != nil{
fmt.Println("Prepare fail")
return false
}
//设置参数以及执行sql语句
res, err := stmt.Exec(userid )
if err != nil{
fmt.Println("Exec fail")
return false
}
//提交事务
tx.Commit()
//获得上一个insert的id
fmt.Println(res.LastInsertId())
return true
}
update
步骤:
- 开启事务: tx, err := DB.Begin()
- 准备sql语句:stmt, err := tx.Prepare("UPDATE nk_user SET name = ?, password = ? WHERE id = ?")
- 执行sql语句:res, err := stmt.Exec(user.UserName, user.Password, user.Id)
- 提交事务: tx.Commit()
//更新代码如下:
func UpdateUser(userName string, password string, id int) bool {
//开启事务
tx, err := DB.Begin()
if err != nil {
fmt.Println("tx fail")
}
//准备sql语句
stmt, err := tx.Prepare("UPDATE nk_user SET name = ?, password = ? WHERE id = ?")
if err != nil {
fmt.Println("Prepare fail")
return false
}
//设置参数以及执行sql语句
res, err := stmt.Exec(userName, password, id)
if err != nil {
fmt.Println("Exec fail")
return false
}
//提交事务
tx.Commit()
fmt.Println(res.LastInsertId())
return true
}
query
- 查询单行数据: 编写sql语句,利用QueryRow函数查询,并且利用Scan将查询结果赋值到对应的对象中
func SelectUserById(id int) (bean.User) {
var user bean.User
err := DB.QueryRow("SELECT * FROM nk_user WHERE id = ?", id).Scan(&user.Id, &user.UserName, &user.Password)
if err != nil{
fmt.Println("查询出错了")
}
return user
}
- 查询多行数据:
- 编写sql语句,执行Query函数
- 利用Next()读取每一行返回的结果,并且利用Scan赋值到相应的对象中
参考代码如下:
func queryData(i int) {
var id int
var name string
var password string
var age int
rows, err := DB.Query("SELECT id,name,password,age FROM nk_user WHERE age > ?", i)
if err != nil {
log.Fatal(err)
}
for rows.Next() {
if err := rows.Scan(&id, &name, &password, &age); err != nil {
log.Fatal(err)
}
fmt.Printf("id: %d, name:%s, password:%s,age:%d\n", id, name, password, age)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
}