首页 > 技术文章 > Go语言实现MySQL连接和增删查改操作

xwxz 2020-08-19 10:54 原文

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)
}

多动手最好自己手写一遍。

推荐阅读