Golang连接操作MySQL数据库

1.安装MySQL驱动

安装方式:打开命令行,执行go命令:

go get -u github.com/go-sql-driver/mysql
2.连接MySQL
  • 构建连接, 格式是:”用户名:密码@tcp(IP:端口)/数据库?charset=utf8”
  • 打开数据库,前者是驱动名,所以要导入: _
    “github.com/go-sql-driver/mysql”
  • 设置数据库最大连接数和设置上数据库最大闲置连接数
  • 验证连接:使用Ping()函数

参考代码如下:

import (
	"database/sql"
	"fmt"
	"strings"

	// 安装方式: go get -u github.com/go-sql-driver/mysql
	_ "github.com/go-sql-driver/mysql"
)

var (
	dbhostsip  = "127.0.0.1:3306"
	dbusername = "root"
	dbpassword = "123456"
	dbname     = "chat"
)

// 初始化数据库
func InitDB() (*sql.DB, error) {
	//构建连接信息
	dbinfo := strings.Join([]string{dbusername, ":", dbpassword, "@tcp(", dbhostsip, ")/", dbname, "?charset=utf8"}, "")
	fmt.Println(dbinfo)
	//打开数据库,前面是驱动名称,所以要导入:mysql驱动github.com/go-sql-driver/mysql
	dbins, err := sql.Open("mysql", dbinfo)
	if nil != err {
		fmt.Println("Open Database Error:", err)
		return nil, err
	}
	// 设置数据库的最大连接数
	dbins.SetConnMaxLifetime(100)
	// 设置数据库最大的闲置连接数
	dbins.SetMaxIdleConns(10)
	// 验证连接
	if err = dbins.Ping(); nil != err {
		fmt.Println("Open Database Fail,Error:", err)
		return nil, err
	}
	fmt.Println("Connect Success!!!")
	return dbins, nil
}
MySQL的增删改查

数据库的insert, delete以及update的步骤内容大致一致,差别就是sql语句的变化,步骤一般如下:

  • 开启事务: tx, err := DB.Begin()

  • 准备sql语句:stmt, err := tx.Prepare(“DELETE FROM nk_user WHERE id = ?”)

  • 执行sql语句:res, err := stmt.Exec(user.Id)

  • 提交事务: tx.Commit()

    参考示例如下:

// 执行命令,可以用于插入、删除、修改操作
func ExecuteCommand(dbins *sql.DB, cmd string) (err error) {
	// 开启事务
	tx, err := dbins.Begin()
	if nil != err {
		fmt.Println("开启事务失败:", cmd, err)
		return err
	}
	// 准备SQL语句失败
	stmt, err := tx.Prepare(cmd)
	if nil != err {
		fmt.Println("准备SQL语句失败:", cmd, err)
		return err
	}
	// 将参数传递到SQL语句中执行
	_, err = stmt.Exec()
	if nil != err {
		fmt.Println("执行SQL语句失败:", cmd, err)
		return err
	}
	// 提交事务
	err = tx.Commit()
	if nil != err {
		fmt.Println("提交事务失败:", err)
	}
	return nil
}
type User struct {
	userid   int
	name     string
	password string
}
// 插入数据示例
func InsertUser(dbins *sql.DB, user User) (id int64, err error) {
	tx, err := dbins.Begin()
	if nil != err {
		fmt.Println("开启事务失败:", err)
		return -1, err
	}
	// 准备SQL语句
	stmt, err := tx.Prepare("insert into user(`userid`, `name`,`password`) values(?,?,?)")
	if nil != err {
		fmt.Println("Prepare Failed!")
		return -1, err
	}
	// 将参数传递到SQL语句中执行
	res, err := stmt.Exec(user.userid, user.name, user.password)
	if nil != err {
		fmt.Println("Exec Failed!")
		return -1, err
	}
	// 将事务提交
	tx.Commit()
	id, err = res.LastInsertId()
	return id, nil
}
// 删除数据示例
func DeleteUser(dbins *sql.DB, user User) (err error) {
	tx, err := dbins.Begin()
	if nil != err {
		fmt.Println("Begin ", err)
		return err
	}
	// 准备SQL
	stmt, err := tx.Prepare("delete from user where userid = ?")
	if nil != err {
		fmt.Println("prepare sql cmd err:", err)
		return err
	}
	// 设置参数以及执行SQL
	res, err := stmt.Exec(user.userid)
	if nil != err {
		fmt.Println("exec failed!")
		return err
	}
	// 提交事务
	id, err := res.LastInsertId()
	fmt.Println("LastInsertId:", id)
	err = tx.Commit()
	return err
}

MySQL的查询,有查询单行,有查询多行的情况,如下所示:

// 查询单行数据:编写SQL语句,利用QueryRow,并且利用Scan将查询结果赋值到对应的对象中
func SelectUserByUserId(dbins *sql.DB, id int) User {
	var user User
	var idx int
	err := dbins.QueryRow("select * from user where userid=?", id).Scan(&idx, &user.userid, &user.name, &user.password)
	if nil != err {
		fmt.Println("QueryRow Error", err)
	}
	return user
}

// 编写sql语句,执行Query函数
// 利用Next()读取每一行返回的结果,并且利用Scan赋值到相应的对象中
// 参考代码如下
func SelectAllUser(dbins *sql.DB) ([]User, error) {
	rows, err := dbins.Query("select * from user")
	if nil != err {
		fmt.Println("Query Error:", err)
		return nil, err
	}
	var uers []User
	for rows.Next() {
		var user User
		var id int
		rows.Scan(&id, &user.userid, &user.name, &user.password)

		uers = append(uers, user)
	}
	return uers, nil
}

你可能感兴趣的:(golang)