zoukankan      html  css  js  c++  java
  • Go语言实现MySQL连接和增删查改操作

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

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

  • 相关阅读:
    正则表达式实例:取得普陀区所有的小区名字和地址
    VS的注释(TODO)
    用本地地址构造出多个虚拟域名
    设置asp.net网站的信任等级
    c#中的多线程和异步处理
    VS2010下MVC4安装
    4、学习《细说PHP》笔记四
    38、UMLet的使用与类图的设计
    1、学习《细说PHP》笔记一
    6、学习《细说PHP》笔记六
  • 原文地址:https://www.cnblogs.com/xwxz/p/13527998.html
Copyright © 2011-2022 走看看