javaer to go之mysql操作
阿新 • • 發佈:2019-01-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)