Golang处理MySQL框架zdpgo_sqlx快速入门教程

准备SQL

sql 复制代码
drop table if exists user;
create table user
(
    id   int primary key auto_increment,
    name varchar(36),
    age  int
) engine = innodb
  character set utf8mb4;

insert into user(name, age)
values ('张三', 23),
       ('张三2', 23),
       ('张三3', 23);

基本增删改查

go 复制代码
package main

import (
	"fmt"
	_ "zdpgo_mysqldriver"
	"zdpgo_sqlx"
)

var (
	db  *zdpgo_sqlx.DB
	err error
)

type user struct {
	Id   int    `db:"id"`
	Age  int    `db:"age"`
	Name string `db:"name"`
}

func main() {
	// 连接
	dsn := "root:zhangdapeng520@tcp(192.168.234.130:3306)/test"
	db, err = zdpgo_sqlx.Open("mysql", dsn)
	if err != nil {
		fmt.Printf("connect server failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(10)

	// 新增
	sqlStr := "INSERT INTO user(name, age) VALUES(?, ?)"
	result, err := db.Exec(sqlStr, "张三", 22)
	if err != nil {
		fmt.Printf("exec failed, err:%v\n", err)
		return
	}
	insertID, err := result.LastInsertId()
	if err != nil {
		fmt.Printf("get insert id failed, err:%v\n", err)
		return
	}
	fmt.Printf("insert data success, id:%d\n", insertID)

	// 查询单个
	sqlStr = "SELECT id, name, age FROM user WHERE id = ?"
	var u user
	if err := db.Get(&u, sqlStr, 1); err != nil {
		fmt.Printf("get data failed, err:%v\n", err)
		return
	}
	fmt.Printf("id:%d, name:%s, age:%d\n", u.Id, u.Name, u.Age)

	// 查询多个
	sqlStr = "SELECT id, name, age FROM user WHERE id > ?"
	var users []user
	if err := db.Select(&users, sqlStr, 0); err != nil {
		fmt.Printf("get data failed, err:%v\n", err)
		return
	}
	for i := 0; i < len(users); i++ {
		fmt.Printf("id:%d, name:%s, age:%d\n", users[i].Id, users[i].Name, users[i].Age)
	}

	// 更新
	sqlStr = "UPDATE user SET age = ? WHERE id = ?"
	result, err = db.Exec(sqlStr, 22, 1)
	if err != nil {
		fmt.Printf("exec failed, err:%v\n", err)
		return
	}
	affectedRows, err := result.RowsAffected()
	if err != nil {
		fmt.Printf("get affected failed, err:%v\n", err)
		return
	}
	fmt.Printf("update data success, affected rows:%d\n", affectedRows)

	// 删除
	sqlStr = "DELETE FROM user WHERE id = ?"
	result, err = db.Exec(sqlStr, 1)
	if err != nil {
		fmt.Printf("exec failed, err:%v\n", err)
		return
	}
	affectedRows, err = result.RowsAffected()
	if err != nil {
		fmt.Printf("get affected failed, err:%v\n", err)
		return
	}
	fmt.Printf("delete data success, affected rows:%d\n", affectedRows)
}

NamedQuery

go 复制代码
package main

import (
	"fmt"
	_ "zdpgo_mysqldriver"
	"zdpgo_sqlx"
)

var (
	db  *zdpgo_sqlx.DB
	err error
)

type user struct {
	Id   int    `db:"id"`
	Age  int    `db:"age"`
	Name string `db:"name"`
}

func main() {
	// 连接
	dsn := "root:zhangdapeng520@tcp(192.168.234.130:3306)/test"
	db, err = zdpgo_sqlx.Open("mysql", dsn)
	if err != nil {
		fmt.Printf("connect server failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(10)

	sqlStr := "SELECT id, name, age FROM user WHERE age = :age"
	rows, err := db.NamedQuery(sqlStr, map[string]interface{}{
		"age": 23,
	})
	if err != nil {
		fmt.Printf("named query failed failed, err:%v\n", err)
		return
	}
	defer rows.Close()
	for rows.Next() {
		var u user
		if err := rows.StructScan(&u); err != nil {
			fmt.Printf("struct sacn failed, err:%v\n", err)
			continue
		}
		fmt.Printf("%#v\n", u)
	}
}

NamedExec

go 复制代码
package main

import (
	"fmt"
	_ "zdpgo_mysqldriver"
	"zdpgo_sqlx"
)

var (
	db  *zdpgo_sqlx.DB
	err error
)

type user struct {
	Id   int    `db:"id"`
	Age  int    `db:"age"`
	Name string `db:"name"`
}

func main() {
	// 连接
	dsn := "root:zhangdapeng520@tcp(192.168.234.130:3306)/test"
	db, err = zdpgo_sqlx.Open("mysql", dsn)
	if err != nil {
		fmt.Printf("connect server failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(10)

	sqlStr := "INSERT INTO user(name, age) VALUES(:name, :age)"
	result, err := db.NamedExec(sqlStr, map[string]interface{}{
		"name": "里斯",
		"age":  18,
	})
	if err != nil {
		fmt.Printf("named exec failed, err:%v\n", err)
		return
	}
	insertId, err := result.LastInsertId()
	if err != nil {
		fmt.Printf("get last insert id failed, err:%v\n", err)
		return
	}
	fmt.Printf("insert data success, id:%d\n", insertId)

	sqlStr = "SELECT id, name, age FROM user WHERE age = :age"
	rows, err := db.NamedQuery(sqlStr, map[string]interface{}{
		"age": 18,
	})
	if err != nil {
		fmt.Printf("named query failed failed, err:%v\n", err)
		return
	}
	defer rows.Close()
	for rows.Next() {
		var u user
		if err := rows.StructScan(&u); err != nil {
			fmt.Printf("struct sacn failed, err:%v\n", err)
			continue
		}
		fmt.Printf("%#v\n", u)
	}
}

事务处理

go 复制代码
package main

import (
	"fmt"
	_ "zdpgo_mysqldriver"
	"zdpgo_sqlx"
)

var (
	db  *zdpgo_sqlx.DB
	err error
)

type user struct {
	Id   int    `db:"id"`
	Age  int    `db:"age"`
	Name string `db:"name"`
}

func main() {
	// 连接
	dsn := "root:zhangdapeng520@tcp(192.168.234.130:3306)/test"
	db, err = zdpgo_sqlx.Open("mysql", dsn)
	if err != nil {
		fmt.Printf("connect server failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(10)

	tx, err := db.Begin()
	if err != nil {
		fmt.Printf("transaction begin failed, err:%v\n", err)
		return
	}

	defer func() {
		if p := recover(); p != nil {
			_ = tx.Rollback()
			panic(p)
		} else if err != nil {
			fmt.Printf("transaction rollback")
			_ = tx.Rollback()
		} else {
			err = tx.Commit()
			fmt.Printf("transaction commit")
			return
		}
	}()

	sqlStr1 := "UPDATE user SET age = ? WHERE id = ? "
	reuslt1, err := tx.Exec(sqlStr1, 18, 1)
	if err != nil {
		fmt.Printf("sql exec failed, err:%v\n", err)
		return
	}
	rows1, err := reuslt1.RowsAffected()
	if err != nil {
		fmt.Printf("affected rows is 0")
		return
	}
	sqlStr2 := "UPDATE user SET age = ? WHERE id = ? "
	reuslt2, err := tx.Exec(sqlStr2, 19, 5)
	if err != nil {
		fmt.Printf("sql exec failed, err:%v\n", err)
		return
	}
	rows2, err := reuslt2.RowsAffected()
	if err != nil {
		fmt.Printf("affected rows is 0\n")
		return
	}

	if rows1 > 0 && rows2 > 0 {
		fmt.Printf("update data success\n")
	}
	return
}

批量添加

go 复制代码
package main

import (
	"fmt"
	_ "zdpgo_mysqldriver"
	"zdpgo_sqlx"
)

var (
	db  *zdpgo_sqlx.DB
	err error
)

type User struct {
	Id   int    `db:"id"`
	Age  int    `db:"age"`
	Name string `db:"name"`
}

type AddUser struct {
	Age  int    `db:"age"`
	Name string `db:"name"`
}

func main() {
	// 连接
	dsn := "root:zhangdapeng520@tcp(192.168.234.130:3306)/test"
	db, err = zdpgo_sqlx.Open("mysql", dsn)
	if err != nil {
		fmt.Printf("connect server failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(10)

	// 准备数据
	u1 := AddUser{Name: "李四1", Age: 18}
	u2 := AddUser{Name: "李四2", Age: 28}
	u3 := AddUser{Name: "李四3", Age: 38}
	users := []interface{}{u1, u2, u3}

	_, err = db.NamedExec("INSERT INTO user (name, age) VALUES (:name, :age)", users)
	fmt.Println(err)
	return
}
···

## in 查询
```go
package main

import (
	"fmt"
	_ "zdpgo_mysqldriver"
	"zdpgo_sqlx"
)

var (
	db  *zdpgo_sqlx.DB
	err error
)

type User struct {
	Id   int    `db:"id"`
	Age  int    `db:"age"`
	Name string `db:"name"`
}

type AddUser struct {
	Age  int    `db:"age"`
	Name string `db:"name"`
}

func main() {
	// 连接
	dsn := "root:zhangdapeng520@tcp(192.168.234.130:3306)/test"
	db, err = zdpgo_sqlx.Open("mysql", dsn)
	if err != nil {
		fmt.Printf("connect server failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(10)

	// 动态填充id
	ids := []int{1, 2, 3}
	query, args, err := zdpgo_sqlx.In("SELECT name, age FROM user WHERE id IN (?)", ids)
	if err != nil {
		panic(err)
	}

	// sqlx.In 返回带 `?` bindvar的查询语句, 我们使用Rebind()重新绑定。
	// 重新生成对应数据库的查询语句(如PostgreSQL 用 `$1`, `$2` bindvar)
	query = db.Rebind(query)
	var users []User
	err = db.Select(&users, query, args...)
	if err != nil {
		panic(err)
	}
	for _, user := range users {
		fmt.Printf("user:%#v\n", user)
	}
}
相关推荐
姜学迁1 小时前
Rust-枚举
开发语言·后端·rust
爱学习的小健2 小时前
MQTT--Java整合EMQX
后端
北极小狐2 小时前
Java vs JavaScript:类型系统的艺术 - 从 Object 到 any,从静态到动态
后端
小吴同学(wlx)2 小时前
Golang 进阶3—— 协程&管道
golang
技术卷2 小时前
GO网络编程(三):海量用户通信系统1:登录功能初步
golang·网络编程
【D'accumulation】2 小时前
令牌主动失效机制范例(利用redis)注释分析
java·spring boot·redis·后端
2401_854391082 小时前
高效开发:SpringBoot网上租赁系统实现细节
java·spring boot·后端
Cikiss2 小时前
微服务实战——SpringCache 整合 Redis
java·redis·后端·微服务
Cikiss2 小时前
微服务实战——平台属性
java·数据库·后端·微服务
OEC小胖胖3 小时前
Spring Boot + MyBatis 项目中常用注解详解(万字长篇解读)
java·spring boot·后端·spring·mybatis·web