用go编写一个单例连接mysql数据库的公用类,实现功能要包含自动连接数据库,自动检查连接是否断开如果断开自动重连,异常处理,对数据表的增删改查
2023-12-07/2023-12-07
fogsun
以下是一个用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