go连接MySQL数据库学习

安装第三方库

go get -u github.com/go-sql-driver/mysql
package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql" // init()
	"time"
)

var db *sql.DB //定义全局的数据库连接池对象

type user struct {
    
    
	id, age int
	name    string
}

初始化数据库连接

func initDB() (err error) {
    
    
	dataSourceName := "root:12345678@tcp(localhost:3306)/test_db"
	db, err = sql.Open("mysql", dataSourceName)
	if err != nil {
    
    
		return
	}

	err = db.Ping() // 测试连接
	if err != nil {
    
    
		return
	}
	// See "Important settings" section.
	db.SetConnMaxLifetime(time.Minute * 3) //连接池⾥⾯的连接最⼤存活时长;
	// maxLifeTime必须要⽐mysql服务器设置的wait_timeout⼩,否则会导致golang连接池依然保留已被mysql服务器关闭了的连接。
	db.SetMaxOpenConns(10) //设置与数据库建立连接的最大数量,如果n<=0,代表无限大
	db.SetMaxIdleConns(10) //设置连接池中最大的闲置连接数量,如果n<=0,不会保留闲置连接
	fmt.Println("database connection is successful")
	return
}

查询单行

func queryOne(id int) {
    
    
	//1.查询单条记录
	sqlStr := "select id,name,age from user where id=?;"

	//2.拿到结果保存到u1中
	var u1 user
	// scan会自动释放连接池的占用
	err := db.QueryRow(sqlStr, id).Scan(&u1.id, &u1.name, &u1.age) // 从连接池取一个连接去执行这个sql语句
	if err != nil {
    
    
		fmt.Println(err)
		return
	}
	fmt.Printf("u1:%#v", u1)
}

查询多行

func queryMore(id int) {
    
    
	sqlStr := `select id,name,age from user where id>?;`

	rowsObj, err := db.Query(sqlStr, id)
	if err != nil {
    
    
		return
	}
	// 一定要关闭
	defer func(rowsObj *sql.Rows) {
    
    
		err := rowsObj.Close()
		if err != nil {
    
    
			return
		}
	}(rowsObj)
	for rowsObj.Next() {
    
    
		var u2 user
		err := rowsObj.Scan(&u2.id, &u2.name, &u2.age)
		if err != nil {
    
    
			return
		}
		fmt.Printf("u2:%#v\n", u2)
	}
}

插入数据

func insert(name string, age int) {
    
    
	sqlStr := `insert into user(name,age) values(?,?);`
	ret, err := db.Exec(sqlStr, name, age)
	if err != nil {
    
    
		return
	}
	theID, err := ret.LastInsertId() // 获取新插入数据的ID
	if err != nil {
    
    
		return
	}
	fmt.Println("theID:", theID)
}

更新数据

func update(id int, age int) {
    
    
	sqlStr := `update user  set age=? where id=?;`
	ret, err := db.Exec(sqlStr, age, id)
	if err != nil {
    
    
		return
	}
	n, err := ret.RowsAffected() // 获取影响的行数
	if err != nil {
    
    
		return
	}
	fmt.Println("affect rows no:", n)
}

删除数据

func delete(name string) {
    
    
	sqlStr := `delete from user where name=?;`
	ret, err := db.Exec(sqlStr, name)
	if err != nil {
    
    
		return
	}
	n, err := ret.RowsAffected() // 获取影响的行数
	if err != nil {
    
    
		return
	}
	fmt.Println("delete rows no:", n)
}

执行

func main() {
    
    
	err := initDB()
	if err != nil {
    
    
		fmt.Printf("Initialized database connection failed:%v:", err)
		return
	}
	//关闭数据库
	defer func(db *sql.DB) {
    
    
		err := db.Close()
		if err != nil {
    
    
			return
		}
	}(db)
	queryOne(1)

	queryMore(0)
	//insert("yangmi", 35)
	//queryMore(0)
	update(1, 86)
	queryMore(0)

	delete("yangmi")
	queryMore(0)
}

猜你喜欢

转载自blog.csdn.net/leptobo/article/details/127035767
今日推荐