Go語言實現MySQL連接和增刪查改操作
1、mysql數據庫驅動安裝
go語言連接數據庫的驅動是:go-sql-driver,在使用mysql之前要下載驅動
打開命令行輸入
go get -u github.com/go-sql-driver/mysql
2、創建數據庫表
下文實例中的數據庫表SQL文件:
CREATE TABLE `stu_info` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`addr` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3、mysql數據庫連接
構建連接, 格式是:”用戶名:密碼@tcp(IP:端口)/數據庫?charset=utf8”
具體增刪查改操作看下文例子
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"strings"
)
type Student struct {
Id int32
Name string
Age int32
Addr string
}
//數據庫配置
const (
userName = "root"
password = "xxw2020"
ip = "127.0.0.1"
port = "3306"
dbName = "student"
)
//Db數據庫連接池
var DB *sql.DB
//注意方法名大寫,就是public
func InitDB() {
//構建連接:"用戶名:密碼@tcp(IP:端口)/數據庫?charset=utf8"
path := strings.Join([]string{userName, ":", password, "@tcp(",ip, ":", port, ")/", dbName, "?charset=utf8"}, "")
fmt.Println(path)
//打開數據庫,前者是驅動名,所以要導入: _ "github.com/go-sql-driver/mysql"
DB, _ = sql.Open("mysql", path)
if DB == nil {
fmt.Println("連接失敗!")
return
}
//設置數據庫最大連接數
DB.SetConnMaxLifetime(10)
//設置上數據庫最大閑置連接數
DB.SetMaxIdleConns(5)
//驗證連接
if err := DB.Ping(); err != nil{
fmt.Println("opon database fail")
return
}
fmt.Println("connnect success")
}
func InsertStu(user Student) (bool){
//開啟事務
tx, err := DB.Begin()
if err != nil{
fmt.Println("tx fail")
return false
}
//准備sql語句
stmt, err := tx.Prepare("INSERT INTO stu_info (`id`,`name`,`age`, `addr`) VALUES (?, ?, ?, ?)")
if err != nil{
fmt.Println("Prepare fail")
return false
}
//將參數傳遞到sql語句中並且執行
res, err := stmt.Exec(user.Id, user.Name, user.Age, user.Addr)
if err != nil{
fmt.Println("Exec fail")
return false
}
//將事務提交
tx.Commit()
//獲得上一個插入自增的id
fmt.Println(res.LastInsertId())
return true
}
//刪除用戶
func DeleteStu(userId int32) (bool) {
//開啟事務
tx, err := DB.Begin()
if err != nil{
fmt.Println("tx fail")
}
//准備sql語句
stmt, err := tx.Prepare("DELETE FROM stu_info WHERE id = ?")
if err != nil{
fmt.Println("Prepare fail")
return false
}
//設置參數以及執行sql語句
res, err := stmt.Exec(userId)
if err != nil{
fmt.Println("Exec fail")
return false
}
//提交事務
tx.Commit()
//獲得上一個insert的id
fmt.Println(res.LastInsertId())
return true
}
//更新數據
func UpdateStu(stu Student) (bool) {
//開啟事務
tx, err := DB.Begin()
if err != nil{
fmt.Println("tx fail")
}
//准備sql語句
stmt, err := tx.Prepare("UPDATE stu_info SET name = ?, age = ? WHERE id = ?")
if err != nil{
fmt.Println("Prepare fail")
return false
}
//設置參數以及執行sql語句
res, err := stmt.Exec(stu.Name, stu.Age, stu.Id)
if err != nil{
fmt.Println("Exec fail")
return false
}
//提交事務
tx.Commit()
fmt.Println(res.LastInsertId())
return true
}
//查詢一行數據
func SelectStuById(id int) (Student) {
var stu Student
err := DB.QueryRow("SELECT * FROM stu_info WHERE id = ?", id).Scan(&stu.Id, &stu.Name, &stu.Age, &stu.Addr)
if err != nil{
fmt.Println("查詢出錯了")
}
return stu
}
//查詢多行數據
func SelectAllStu() ([]Student) {
//執行查詢語句
rows, err := DB.Query("SELECT * from stu_info")
if err != nil{
fmt.Println("查詢出錯了")
}
var stus []Student
//循環讀取結果
for rows.Next(){
var stu Student
//將每一行的結果都賦值到一個user對象中
err := rows.Scan(&stu.Id, &stu.Name, &stu.Age, &stu.Addr)
if err != nil {
fmt.Println("rows fail")
}
//將user追加到users的這個數組中
stus = append(stus, stu)
}
return stus
}
func main() {
InitDB()
stu := Student{
Id: 3,
Name: "xxw",
Age: 20,
Addr: "北京",
}
fmt.Println(stu)
//InsertStu(stu) //注釋的操作自己選擇進行。
//DeleteStu(4)
//UpdateStu(stu)
//stutemp := SelectStuById(1)
//fmt.Println(stutemp)
stus := SelectAllStu()
fmt.Println(stus)
}
多動手最好自己手寫一遍。