package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
func initDB() (err error) {
db, err = sql.Open("mysql", "root:mm..1213@tcp(127.0.0.1:3306)/chapter4")
if err != nil {
return nil
}
err = db.Ping()
if err != nil {
return err
}
return nil
}
type User struct {
Uid int
Name string
Phone string
}
func queryRow() {
u := User{}
err := db.QueryRow("select uid,name,phone from `user` where uid=?", 1).Scan(&u.Uid, &u.Name, &u.Phone)
if err != nil {
fmt.Printf("scan failed,err:%v\n", err)
return
}
fmt.Printf("uid:%d name:%s phone:%s\n", u.Uid, u.Name, u.Phone)
}
func queryMultiRow() {
u := User{}
rows, err := db.Query("select uid,name,phone from `user` where uid > ?", 0)
if err != nil {
fmt.Printf("query failed, err:%v\n", err)
return
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(&u.Uid, &u.Name, &u.Phone)
if err != nil {
fmt.Printf("scan failed, err:%v\n", err)
return
}
fmt.Printf("uid:%d name:%s phone:%s\n", u.Uid, u.Name, u.Phone)
}
}
func insertRow() {
ret, err := db.Exec("insert into user(name,phone) values (?,?)", "王五", 13988557744)
if err != nil {
fmt.Printf("insert failed,err:%v\n", err)
return
}
uid, err := ret.LastInsertId()
if err != nil {
fmt.Printf("get lastinsert Id failed,err:%v\n", err)
return
}
fmt.Printf("insert success,the id is %d.\n", uid)
}
func updateRow() {
ret, err := db.Exec("update user set name=? where uid =?", "张三", 3)
if err != nil {
fmt.Printf("update failed,err:%v\n", err)
return
}
n, err := ret.RowsAffected()
if err != nil {
fmt.Printf("get RowsAffected failed,err:%v\n", err)
}
fmt.Printf("update success, affected rows:%d\n", n)
}
func deleteRow() {
ret, err := db.Exec("delete from user where uid = ?", 2)
if err != nil {
fmt.Printf("delete failed,err:%v\n", err)
return
}
n, err := ret.RowsAffected()
if err != nil {
fmt.Printf("get RowsAffected failed,err:%v\n", err)
return
}
fmt.Printf("delete success,affected rows:%d\n", n)
}
func prepareQuery() {
u := User{}
stmt, err := db.Prepare("select uid,name,phone from `user` where uid>?")
if err != nil {
fmt.Printf("prepare failed,err:%v\n", err)
return
}
defer stmt.Close()
rows, err := stmt.Query(0)
if err != nil {
fmt.Printf("prepare failed:%v\n", err)
return
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(&u.Uid, &u.Name, &u.Phone)
if err != nil {
fmt.Printf("scan failed %v\n", err)
return
}
fmt.Printf("uid:%d name:%s phone:%s\n", u.Uid, u.Name, u.Phone)
}
}
func prepareInsert() {
stmt, err := db.Prepare("insert into user(name,phone) values (?,?)")
if err != nil {
fmt.Printf("prepare failed,err:%v\n", err)
return
}
defer stmt.Close()
_, err = stmt.Exec("barry", 18799887766)
if err != nil {
fmt.Printf("insert failed,err:%v\n", err)
return
}
_, err = stmt.Exec("jim", 18999999999)
if err != nil {
fmt.Printf("insert failed,err:%v\n", err)
return
}
fmt.Printf("insert success")
}
func transaction() {
tx, err := db.Begin()
if err != nil {
if tx != nil {
tx.Rollback()
}
fmt.Printf("begin trans failed,err:%v\n", err)
return
}
_, err = tx.Exec("update user set name='james' where uid=?", 1)
if err != nil {
tx.Rollback()
fmt.Printf("exec sql1 failed,err:%v\n", err)
return
}
_, err = tx.Exec("update user set name='james' where uid=?", 3)
if err != nil {
tx.Rollback()
fmt.Printf("exec sql2 failed,err:%v\n", err)
return
}
tx.Commit()
fmt.Printf("exec transaction success!")
}
func sqlInject(name string) {
sqlStr := fmt.Sprintf("select uid, name, phone from user where name='%s'", name)
fmt.Printf("SQL:%s\n", sqlStr)
rows, err := db.Query(sqlStr)
if err != nil {
fmt.Printf("query failed,err:%v\n", err)
return
}
defer rows.Close()
for rows.Next() {
u := User{}
err := rows.Scan(&u.Uid, &u.Name, &u.Phone)
if err != nil {
fmt.Printf("scan failed %v\n", err)
return
}
fmt.Printf("uid:%d name:%s phone:%s\n", u.Uid, u.Name, u.Phone)
}
}
func main() {
err := initDB()
if err != nil {
fmt.Printf("init db failed,err:%v\n", err)
}
sqlInject("james")
}