源码

package main

import (
	"fmt"
	"gitee.com/liumou_site/logger"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
	"os"
)

type MysqlApi struct {
	UserName string   // 数据库登录用户名
	Password string   // 数据库登录密码
	Host     string   // 数据库登录地址
	Port     int      // 数据库端口
	DbName   string   // 数据库名称
	Charset  string   // 字符编码
	Db       *sqlx.DB // 数据库实例
}
type Person struct {
	UserId   int    `db:"id"`
	UserName string `db:"name"`
	UserAge  int    `db:"age"`
}

func MysqlConfig() *MysqlApi {
	Login := new(MysqlApi)
	Login.Charset = "utf8"   // 字符编码
	Login.UserName = "root"  // 登录用户
	Login.Port = 3306        // 数据库端口
	Login.Host = "127.0.0.1" // 数据库登录地址
	Login.Password = "1"     // 数据库登录密码
	Login.DbName = "liumou"  // 数据库名称
	Arg := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", Login.UserName, Login.Password, Login.Host, Login.Port, Login.DbName, Login.Charset)
	fmt.Println(Arg)
	Db, err := sqlx.Open("mysql", Arg)
	if err != nil {
		logger.Error("数据库连接失败, 详细信息: ", err.Error())
		os.Exit(1)
	}
	Login.Db = Db
	return Login

}

// AddUser 在数据表中添加用户信息
func (sql *MysqlApi) AddUser() {
	for i := 2; i < 5; i++ {
		result, err := sql.Db.Exec("insert into demo  values(?,?,?)", i, "刘德华", 18)
		if err != nil {
			logger.Error("数据插入失败,详细信息: ", err.Error())
			return
		}
		id, _ := result.LastInsertId()
		logger.Info("数据插入成功,ID: ", id)
	}
}

// UpdateName 更新id值1的用户名
func (sql *MysqlApi) UpdateName() {
	result, err := sql.Db.Exec("update demo set name = '刘亦菲' where id = 1")
	if err != nil {
		logger.Error("更新失败, 详细信息: ", err.Error())
		return
	}
	num, _ := result.RowsAffected()
	logger.Info("更新成功,影响的行数: ", num)
}

// DeleteUser 删除ID值2的用户
func (sql *MysqlApi) DeleteUser() {
	result, err := sql.Db.Exec("delete from demo where id = 2")
	if err != nil {
		logger.Error("删除失败, 详细信息: ", err.Error())
		return
	}
	num, _ := result.RowsAffected()
	logger.Info("删除成功,影响的行数: ", num)
}

// SelectUser 查询用户信息
func (sql *MysqlApi) SelectUser() {
	var person []Person
	// 手动关闭连接,模拟程序自动断开连接
	err := sql.Db.Close()
	if err != nil {
		return
	}
	// 判断当前连接是否正常,如果已断开则重新连接
	if err := sql.Db.Ping(); err != nil {
		logger.Error("连接已断开,正在重新连接")
		sqlps := MysqlConfig()
		sql.Db = sqlps.Db
	}
	err = sql.Db.Select(&person, "select * from liumou.demo;")
	if err != nil {
		//fmt.Printf("查询失败, 详细信息:[%v]", err.Error())
		logger.Error("查询失败:", err)
	} else {
		logger.Info("查询成功,数据如下")
		fmt.Println(person)
	}
}
func main() {
	mysql := MysqlConfig()
	mysql.AddUser()
	mysql.UpdateName()
	mysql.DeleteUser()
	mysql.SelectUser()
	err := mysql.Db.Close()
	if err != nil {
		logger.Error("连接关闭失败")
		return
	} else {
		logger.Info("连接关闭成功")
	}
}


效果

PS D:\DATA\git\GoLang\Demos\go-mysql> go run .\mysql.go
root:1@tcp(127.0.0.1:3306)/liumou?charset=utf8
[2023-01-07 11:08:18] [INFO] [mysql.go:55] 数据插入成功,ID:  0
[2023-01-07 11:08:18] [INFO] [mysql.go:55] 数据插入成功,ID:  0
[2023-01-07 11:08:18] [INFO] [mysql.go:55] 数据插入成功,ID:  0
[2023-01-07 11:08:18] [INFO] [mysql.go:67] 更新成功,影响的行数:  0
[2023-01-07 11:08:18] [INFO] [mysql.go:78] 删除成功,影响的行数:  1
[2023-01-07 11:08:18] [EROR] [mysql.go:91] 连接已断开,正在重新连接
root:1@tcp(127.0.0.1:3306)/liumou?charset=utf8                    
[2023-01-07 11:08:18] [INFO] [mysql.go:100] 查询成功,数据如下     
[{1 刘亦菲 1} {3 刘德华 18} {4 刘德华 18}]                        
[2023-01-07 11:08:18] [INFO] [mysql.go:115] 连接关闭成功        
PS D:\DATA\git\GoLang\Demos\go-mysql> 

附-数据表创建语句

CREATE TABLE `demo` (
	`id` INT(11) NULL DEFAULT NULL,
	`name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
	`work` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci'
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB;