go
复制代码
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
// 定义全局db对象
var db *sqlx.DB
// 用户结构体
type User struct {
ID int `db:"id"`
Username string `db:"username"`
Password string `db:"password"`
Age int `db:"age"`
}
// 初始化数据库连接
func initDB() (err error) {
// 连接数据库
dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True"
db, err = sqlx.Connect("mysql", dsn)
if err != nil {
return err
}
// 设置连接池参数
db.SetMaxOpenConns(100)
db.SetMaxIdleConns(10)
return nil
}
// 创建数据库
func createDatabase() error {
_, err := db.Exec("CREATE DATABASE IF NOT EXISTS test DEFAULT CHARACTER SET utf8mb4")
return err
}
// 删除数据库
func dropDatabase() error {
_, err := db.Exec("DROP DATABASE IF EXISTS test")
return err
}
// 创建表
func createTable() error {
sql := `
CREATE TABLE IF NOT EXISTS users(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(50) NOT NULL,
age INT
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
`
_, err := db.Exec(sql)
return err
}
// 删除表
func dropTable() error {
_, err := db.Exec("DROP TABLE IF EXISTS users")
return err
}
// 插入单条数据
func insertUser(user User) error {
sql := "INSERT INTO users(username, password, age) VALUES (?, ?, ?)"
_, err := db.Exec(sql, user.Username, user.Password, user.Age)
return err
}
// 批量插入数据
func batchInsertUsers(users []User) error {
sql := "INSERT INTO users(username, password, age) VALUES (:username, :password, :age)"
_, err := db.NamedExec(sql, users)
return err
}
// 查询单个用户
func getUserByID(id int) (User, error) {
var user User
sql := "SELECT * FROM users WHERE id=?"
err := db.Get(&user, sql, id)
return user, err
}
// 查询多个用户
func getUsers(age int) ([]User, error) {
var users []User
sql := "SELECT * FROM users WHERE age > ?"
err := db.Select(&users, sql, age)
return users, err
}
// 更新用户
func updateUser(user User) error {
sql := "UPDATE users SET password=?, age=? WHERE username=?"
_, err := db.Exec(sql, user.Password, user.Age, user.Username)
return err
}
// 删除用户
func deleteUser(id int) error {
sql := "DELETE FROM users WHERE id=?"
_, err := db.Exec(sql, id)
return err
}
func main() {
// 初始化数据库连接
if err := initDB(); err != nil {
fmt.Printf("init db failed, err:%v\n", err)
return
}
defer db.Close()
// 创建数据库
if err := createDatabase(); err != nil {
fmt.Printf("create database failed, err:%v\n", err)
return
}
// 创建表
if err := createTable(); err != nil {
fmt.Printf("create table failed, err:%v\n", err)
return
}
// 插入单个用户
user1 := User{
Username: "张三",
Password: "123456",
Age: 20,
}
if err := insertUser(user1); err != nil {
fmt.Printf("insert user failed, err:%v\n", err)
return
}
// 批量插入用户
users := []User{
{Username: "李四", Password: "123456", Age: 21},
{Username: "王五", Password: "123456", Age: 22},
{Username: "赵六", Password: "123456", Age: 23},
}
if err := batchInsertUsers(users); err != nil {
fmt.Printf("batch insert users failed, err:%v\n", err)
return
}
// 查询单个用户
user, err := getUserByID(1)
if err != nil {
fmt.Printf("get user failed, err:%v\n", err)
return
}
fmt.Printf("user:%#v\n", user)
// 查询多个用户
userList, err := getUsers(20)
if err != nil {
fmt.Printf("get users failed, err:%v\n", err)
return
}
fmt.Printf("users:%#v\n", userList)
// 更新用户
user1.Password = "654321"
if err := updateUser(user1); err != nil {
fmt.Printf("update user failed, err:%v\n", err)
return
}
// 删除用户
if err := deleteUser(1); err != nil {
fmt.Printf("delete user failed, err:%v\n", err)
return
}
// 删除表
if err := dropTable(); err != nil {
fmt.Printf("drop table failed, err:%v\n", err)
return
}
// 删除数据库
if err := dropDatabase(); err != nil {
fmt.Printf("drop database failed, err:%v\n", err)
return
}
}