Bolo  当前访客:1 管理登录

日常点滴记忆

一任群芳妒,无边丝雨细。 蓬莱此去无多路,青鸟殷勤为探看。

用go编写一个单例连接mysql数据库的公用类,实现功能要包含自动连接数据库,自动检查连接是否断开如果断开自动重连,异常处理,对数据表的增删改查

2023-12-07/2023-12-07 fogsun
0  评论    315  浏览

以下是一个用Go编写的连接MySQL数据库的单例类示例,其中包含了自动连接、自动重连、异常处理以及对数据表的增删改查功能:

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql"
)

type DatabaseConnection struct {
	db *sql.DB
}

var instance *DatabaseConnection

func GetInstance() *DatabaseConnection {
	if instance == nil {
		instance = &DatabaseConnection{}
		instance.Connect()
	}
	return instance
}

func (c *DatabaseConnection) Connect() {
	db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/database_name")
	if err != nil {
		log.Fatal("Failed to connect to the database:", err.Error())
	}
	err = db.Ping()
	if err != nil {
		log.Fatal("Failed to ping the database:", err.Error())
	}
	c.db = db
}

func (c *DatabaseConnection) Reconnect() {
	c.Close()
	c.Connect()
}

func (c *DatabaseConnection) Close() {
	if c.db != nil {
		err := c.db.Close()
		if err != nil {
			log.Println("Failed to close the database connection:", err.Error())
		}
	}
}

func (c *DatabaseConnection) ExecuteUpdate(query string, args ...interface{}) {
	_, err := c.db.Exec(query, args...)
	if err != nil {
		log.Println("Failed to execute update query:", err.Error())
	}
}

func (c *DatabaseConnection) ExecuteQuery(query string, args ...interface{}) (*sql.Rows, error) {
	rows, err := c.db.Query(query, args...)
	if err != nil {
		log.Println("Failed to execute query:", err.Error())
		return nil, err
	}
	return rows, nil
}

func main() {
	db := GetInstance()

	// 示例:插入数据
	insertQuery := "INSERT INTO users (name, age) VALUES (?, ?)"
	db.ExecuteUpdate(insertQuery, "John Doe", 30)

	// 示例:更新数据
	updateQuery := "UPDATE users SET age = ? WHERE name = ?"
	db.ExecuteUpdate(updateQuery, 31, "John Doe")

	// 示例:查询数据
	selectQuery := "SELECT name, age FROM users WHERE age > ?"
	rows, err := db.ExecuteQuery(selectQuery, 30)
	if err != nil {
		log.Fatal("Failed to fetch data from the database:", err.Error())
	}
	defer rows.Close()
	for rows.Next() {
		var name string
		var age int
		err := rows.Scan(&name, &age)
		if err != nil {
			log.Println("Failed to scan data from the result set:", err.Error())
			continue
		}
		fmt.Println("Name:", name, ", Age:", age)
	}
	if err := rows.Err(); err != nil {
		log.Println("Failed to fetch data from the result set:", err.Error())
	}

	// 示例:删除数据
	deleteQuery := "DELETE FROM users WHERE name = ?"
	db.ExecuteUpdate(deleteQuery, "John Doe")

	db.Close()
}

在上述示例中,DatabaseConnection 结构体实现了单例模式,通过 GetInstance 方法获取实例。在 Connect 方法中自动连接数据库,并检查连接状态。在 Reconnect 方法中进行自动重连。Close 方法用于关闭数据库连接。ExecuteUpdate 方法用于执行增删改语句,ExecuteQuery 方法用于执行查询语句。示例代码演示了插入数据、更新数据、查询数据以及删除数据的使用。你可以根据自己的需求进行相应的修改和扩展。请确保在连接数据库时提供正确的连接参数。


标题:用go编写一个单例连接mysql数据库的公用类,实现功能要包含自动连接数据库,自动检查连接是否断开如果断开自动重连,异常处理,对数据表的增删改查
作者:fogsun
地址:HTTPS://nb500.cn/articles/2023/12/07/1701916324716.html

TOP