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)
}
多动手最好自己手写一遍。