一.查询单条数据
查询单条数据使用QueryRow
1.将数据库连接封装成单独的函数
var db *sql.DB //连接池对象
func initDB() (err error) {
// DSN:Data Source Name
dsn := "root:123456@tcp(127.0.0.1:3306)/test2"
db, err = sql.Open("mysql", dsn) //open不会校验用户名和密码是否正确
if err != nil {
return
}
err = db.Ping()
if err != nil {
return
}
db.SetMaxOpenConns(10) //设置数据库连接池的最大连接数 10
db.SetMaxIdleConns(5) //设置最大空闲连接数
return
}
2.定义一个结构体
type user struct { //结构体
id int
name string
age int
}
3.构造一个查询单条数据的函数
func queryOne(id int) {
var u1 user
// 1.写查询单条记录的sql语句
sqlStr := "select id,name,age from user where id =?;"
//2.执行并拿到结果
//必须对row对象调用scan方法,该方法会释放数据库连接
db.QueryRow(sqlStr, id).Scan(&u1.id, &u1.name, &u1.age) //从连接池拿一个连接出去数据库查询单条记录
//打印结果
fmt.Println(u1)
}
注意:函数可以接受传入的值作为sql语句中的条件。scan方法将查的结果复制给user 然后关闭结果集。
4.main函数中
func main() {
err := initDB()
if err != nil {
fmt.Printf("init DB failed err:%v\n", err)
}
fmt.Println("连接数据库成功")
queryOne(2)
}
结果
二.查询多条数据
查询多条数据使用Query
1.定义一个查询多条数据的函数
func queryMore(n int) {
//1.sql语句
sqlStr := "select id,name,age from user where id >?;"
//2.执行
rows, err := db.Query(sqlStr, n)
if err != nil {
fmt.Println(err)
return
}
//3.一定要关闭rows
defer rows.Close()
//4.循环取值
for rows.Next() {
var u1 user
err := rows.Scan(&u1.id, &u1.name, &u1.age)
if err != nil {
fmt.Println(err)
}
fmt.Println(u1)
}
}
注意:一定要关闭 rows
2.main函数中调用以及打印结果
三.新增一条数据
注意:增删改数据都使用 Exec
1.定义一个新增数据的函数
func insert() {
//写sql语句
sqlStr := "insert into user(name,age) values ('feifei',20)"
//exec
ret, err := db.Exec(sqlStr)
if err != nil {
fmt.Printf("insert failed %v\n", err)
return
}
//如果是插入操作,可以拿到插入数据的id
id, err := ret.LastInsertId()
if err != nil {
fmt.Printf("get id failed %v\n", err)
return
}
fmt.Println("id:", id)
}
2.main函数中调用以及执行结果
3.数据表
四.更新一条数据
1.更新数据的函数
func updateRow() {
sqlStr := "update user set age=100 where id > 2"
ret, err := db.Exec(sqlStr)
if err != nil {
fmt.Printf("update failed %v\n", err)
return
}
//RowsAffected获取更新了几行
n, err := ret.RowsAffected()
if err != nil {
fmt.Printf("get n failed %v\n", err)
return
}
fmt.Printf("更新了%d行数据", n)
}
2.main中调用函数以及执行结果
3.数据库
注意:函数也可以接受一个数据传入
五.删除数据
1.删除数据的函数
func deleteRow(id int) {
sqlStr := "delete from user where id >?"
ret, err := db.Exec(sqlStr, id)
if err != nil {
fmt.Printf("delete failed %v\n", err)
return
}
n, err := ret.RowsAffected()
if err != nil {
fmt.Printf("get n failed %v\n", err)
return
}
fmt.Printf("删除了%d行数据", n)
}
2.main中调用函数以及执行结果
3.数据库