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" )
}