javaertogo之mysql操作

benben_3er發表於2016-03-30

經過度娘後,發現比較常用golang mysql驅動包有兩種mymysql和go-sql-driver/mysql。個人覺得mymysql這個名字起得不夠文雅。所以我選擇了go-sql-driver/mysql。

1、go-sql-driver/mysql的安裝

因為go-sql-driver/mysql屬於第三方的包,所以我們需要先獲取到這個包。

通過系統的shell工具(命令列),把安裝包加到我們的$GOPATH。

go get github.com/go-sql-driver/mysql

這裡要注意的是:使用上面的命令不單要配置好Golang的環境,還需要把git的bin目錄配置到Path環境變數中。

2、操作mysql

  • 導包
import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

因為我們使用過程中,並沒有直接使用到go-sql-driver/mysql,而是通過database/sql中的介面來使用驅動,這點和java的思想是一樣的。所以我們在匯入go-sql-driver/mysql包的時候,通過下劃線作為佔位符,告訴golang不會直接使用此包的內容。

注:

如果你匯入了一個包卻沒有使用它,則會在構建程式時引發錯誤,如 imported and not used: os,這正是遵循了 Go 的格言:“沒有不必要的程式碼!“。

變數的宣告也一樣,你如果宣告瞭一個變數,卻沒有使用這個變數,也會引發錯誤。

佔位符的存在,解決了你既要匯入這個包,但又不會顯式使用包的問題。

  • 建立連線
db, err := sql.Open("mysql", "使用者名稱:密碼@/資料庫名?charset=utf8")

Open函式會返回兩個值,但我們如果只需要db值,而不考慮error的話,可以使用佔位符:

db, _:= sql.Open("mysql", "使用者名稱:密碼@/資料庫名?charset=utf8")
  • Exec
_, err := db.Exec(sql)

Exec函式可以執行一條無返回的sql,如delete、update、insert操作。

  • Prepare
    預處理折方式處理sql
    如:

增加:

stmt, err := db.Prepare(`INSERT user (user_name,user_age,user_sex) values (?,?,?)`)
checkErr(err)
res, err := stmt.Exec("tony", 20, 1)
checkErr(err)
id, err := res.LastInsertId()
checkErr(err)

修改:

stmt, err := db.Prepare(`UPDATE user SET user_age=?,user_sex=? WHERE user_id=?`)
checkErr(err)
res, err := stmt.Exec(21, 2, 1)
checkErr(err)
num, err := res.RowsAffected()
checkErr(err)

刪除:

stmt, err := db.Prepare(`DELETE FROM user WHERE user_id=?`)
checkErr(err)
res, err := stmt.Exec(1)
checkErr(err)
num, err := res.RowsAffected()
checkErr(err)
  • Query

查詢返回多條記錄。

    rows, err := db.Query("select id,nickname from user")
    if err != nil {
        fmt.Println(err.Error())
    }

    defer rows.Close()
    for rows.Next() {
        var id int
        var nickname string
        rows.Scan(&id, &nickname)

        fmt.Println(nickname)
    }
    db.Close()
  • QueryRow
    查詢返回一條記錄。
    row := Open().QueryRow("select id,nickname from user where id=129986")

    var id int
    var nickname string
    row.Scan(&id, &nickname)


相關文章