package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql" //下载的mysql驱动
"fmt"
)
var db *sql.DB //连接池
func initDB() (err error) {
dsn := "root:wyz@tcp(127.0.0.1:3306)/wang"
//导入了未使用,为什么能通过"mysql"字符串找到"github.com/go-sql-driver/mysql"?
//init()函数里,向"database/sql"注册了一个"mysql"驱动
db, err = sql.Open("mysql", dsn)
if err != nil{
return
}
err = db.Ping()
if err != nil {
return
}
//设置数据库连接池的最大连接数
db.SetMaxOpenConns(100)
//设置最大空闲连接数(没人用的时候会关闭一些连接)
db.SetMaxIdleConns(50)
return
}
type user struct {
id int64
name string
age int
}
// 查询单行记录
func queryRow(id int) *user {
var u1 user
//1.写查询条件查单条记录
sqlStr := `select id, name, age from user where id=?`
//2.执行并拿到结果,返回一行或者nil
//必须对rowObj对象调用Scan方法,因为该方法会归还数据库连接
db.QueryRow(sqlStr, id).Scan(&u1.id, &u1.name, &u1.age)
//返回结果
return &u1
}
// 查询多行记录
func queryRows(id int) {
sqlStr := "select id, name, age from user where id > ?"
rows, err := db.Query(sqlStr, id)
if err != nil {
fmt.Println("查询失败:", err)
return
}
// 非常重要:关闭rows释放持有的数据库链接
defer rows.Close()
// 循环读取结果集中的数据
for rows.Next() {
var u user
err := rows.Scan(&u.id, &u.name, &u.age)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
}
}
// 插入数据
func insertRow() {
sqlStr := "insert into user(name, age) values (?,?)"
ret, err := db.Exec(sqlStr, "带头大哥", 38) //ret用于获取插入那一行的ID
if err != nil {
fmt.Printf("插入数据失败:%v\n", err)
return
}
lastID, err := ret.LastInsertId() // 新插入数据的id
if err != nil {
fmt.Printf("获取ID失败:%v\n", err)
return
}
fmt.Printf("插入数据成功ID:%d.\n", lastID)
}
// 更新数据
func updateRow() {
sqlStr := "update user set age=? where id = ?"
ret, err := db.Exec(sqlStr, 39, 4) // ret用于获取受影响的行数
if err != nil {
fmt.Printf("更新失败:%v\n", err)
return
}
n, err := ret.RowsAffected() // 操作影响的行数
if err != nil {
fmt.Printf("获取受影响行数失败:%v\n", err)
return
}
fmt.Printf("更新成功,影响行数:%d\n", n)
}
// 删除数据
func deleteRow() {
sqlStr := "delete from user where id = ?"
ret, err := db.Exec(sqlStr, 3) // ret用于获取受影响的行数
if err != nil {
fmt.Printf("删除失败:%v\n", err)
return
}
n, err := ret.RowsAffected() // 操作影响的行数
if err != nil {
fmt.Printf("获取受影响行数失败:%v\n", err)
return
}
fmt.Printf("删除成功,影响行数:%d\n", n)
}
func main() {
err := initDB()
if err != nil {
fmt.Println("连接数据库成功")
}
u1 := queryRow(1)
fmt.Println(u1)
queryRows(1)
}