数据库的连接
func initmysql() (err error) {
dsn := "root:0806@tcp(127.0.0.1:3306)/sql_demo" //固定格式
db, err = sql.Open("mysql", dsn)
if err != nil {
panic(err)
}
err = db.Ping()
if err != nil {
fmt.Println("ping 失败")
return err
}
// 数值需要根据业务情况 决定
db.SetConnMaxLifetime(time.Second * 10) //10s
db.SetMaxOpenConns(3) //最大连接数
db.SetMaxIdleConns(1) //复用的 //最大空闲连接数
return
}
主函数检测是否合法
err := initmysql() if err != nil { fmt.Println("连接mysql失败") } //做完错误检查之后,确保db不为nil defer db.Close() fmt.Println("连接数据库mysql") //不能保证连接成功
增删查改函数
type user struct {
id int
name string
age int
} //用来接收扫描的对象
func querymultirow() {
sqlstr := "select * from user where id>?"
rows, err := db.Query(sqlstr, 0)
if err != nil {
fmt.Println("queur faild", err)
return
}
defer rows.Close()
for rows.Next() {
var u user
err := rows.Scan(&u.id, &u.name, &u.age)
if err != nil {
fmt.Println("scan faild", err)
}
fmt.Println(u)
}
} //查询多行
func queryRowdemo() {
sqlstr := "select * from user where id=?"
var u user
//此时这个row 没有调用scan ,那么链接不会释放
//记住query调用完之后,一定调用scan方法
row := db.QueryRow(sqlstr, 1) //每个row 是占用连接的
// 连接没有了,不能再查询了 ,程序阻塞住了
row = db.QueryRow(sqlstr, 2)
err := row.Scan(&u.id, &u.name, &u.age)
if err != nil {
fmt.Println("scan err:", err)
return
}
fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
} //查询单行记录
func insertrowdemo() {
sqlstr := "insert into user(name,age) values(?,?)"
ret, err := db.Exec(sqlstr, "王五", 88)
if err != nil {
fmt.Println("insert err:", err)
}
theid, err := ret.LastInsertId() //新插入的id
if err != nil {
fmt.Println("insert err:", err)
return
}
fmt.Println("insert id:", theid)
} //插入数据
func updaterowdemo() {
sqlstr := "update user set age=? where id=?"
ret, err := db.Exec(sqlstr, 39, 1) //把id为
if err != nil {
fmt.Println("update err:", err)
}
n, err := ret.RowsAffected() //影响的行数
if err != nil {
fmt.Println("update err:", err)
}
fmt.Println("affected:", n)
} //更新数据
事务
func transactiondemo() {
tx, err := db.Begin() //开启事务
if err != nil {
if tx != nil {
tx.Rollback() //回滚
}
fmt.Println("begin err:", err)
return
}
sqlstr := "update user set age=36 where id=?"
ret1, err := tx.Exec(sqlstr, 1)
if err != nil {
tx.Rollback()
fmt.Println("exec err:", err)
return
}
aff1, err := ret1.RowsAffected()
if err != nil {
tx.Rollback()
fmt.Println("RowsAffected", err)
return
}
sqlstr2 := "update user set age=40 where id=?"
ret2, err := tx.Exec(sqlstr2, 2)
if err != nil {
tx.Rollback()
fmt.Println("exec err:", err)
return
}
aff2, err := ret2.RowsAffected()
if err != nil {
tx.Rollback()
fmt.Println("RowsAffected", err)
return
}
fmt.Println(aff1, aff2)
if aff1 == 1 && aff2 == 1 {
err = tx.Commit()
fmt.Println("事务提交啦")
if err != nil {
tx.Rollback()
fmt.Println("commit err:", err)
return
}
} else {
err = tx.Rollback()
fmt.Println("tx.rollback err:回滚啦", err)
}
}
main函数
func main() {
err := initmysql()
if err != nil {
fmt.Println("连接mysql失败")
}
//做完错误检查之后,确保db不为nil
defer db.Close()
fmt.Println("连接数据库mysql") //不能保证连接成功
查询单行数据
//queryRowdemo()
查询多行数据
//querymultirow()
插入一条数据
//insertrowdemo()
//updaterowdemo()
querymultirow()
fmt.Println("查询结束了。。。。")
transactiondemo()
querymultirow()
}
小计:
{
//批量执行同一条sql语句,考虑预处理提升性能//sql注入就是,传参的名字不合法如 “xxx”,不要自己拼接;
}// 事务的相关方法 begin() commit