赞
踩
- 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)
- }
-
- }
- 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。