一个基于泛型的轻量级数据库操作包装器,提供了简洁的链式API来执行常见的数据库操作。
- 泛型支持:使用Go 1.21+的泛型特性,提供类型安全的操作
- 链式调用:流畅的API设计,支持链式调用
- 自动映射:自动将数据库记录映射到Go结构体
- 事务支持:支持事务操作
- 逻辑删除:内置逻辑删除支持
- 自动时间戳:支持自动填充创建时间和更新时间
- 批量操作:支持批量插入和分批插入
- 分页查询:内置分页功能
- 多数据库支持:支持MySQL、SQLite等主流数据库
go get github.com/shangjundragon/dbwrapperpackage main
import (
"database/sql"
"log"
"github.com/shangjundragon/dbwrapper"
_ "github.com/go-sql-driver/mysql" // MySQL驱动
// 或者 _ "github.com/glebarez/go-sqlite" // SQLite驱动
)
func main() {
// 连接数据库
db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
log.Fatal(err)
}
// 初始化dbwrapper配置
dbwrapper.InitConfig(func(config *dbwrapper.Config) {
config.Db = db
config.Debug = true // 开启调试模式,打印SQL语句
config.DriverName = "mysql" // 设置数据库驱动
})
// 现在可以使用dbwrapper了
}type User struct {
Id int64 `dbw:"primaryKey"` // 主键标识
Username string `db:"username"`
Email string `db:"email"`
Age int `dbw:"default:18"` // 默认值
Status int `db:"status"`
CreateTime time.Time `dbw:"autoCreateTime"` // 自动创建时间
UpdateTime time.Time `dbw:"autoUpdateTime"` // 自动更新时间
DelFlag string `dbw:"tableLogic"` // 逻辑删除标志
}// 单条插入
user := &User{
Username: "john_doe",
Email: "john@example.com",
Age: 25,
Status: 1,
}
affected, err := dbwrapper.NewQuery[User]().Insert(user)
if err != nil {
log.Fatal(err)
}
fmt.Printf("插入成功,影响行数: %d\n", affected)
fmt.Printf("插入后的ID: %d\n", user.Id)// 批量插入
users := []User{
{Username: "user1", Email: "user1@example.com", Age: 20},
{Username: "user2", Email: "user2@example.com", Age: 25},
{Username: "user3", Email: "user3@example.com", Age: 30},
}
affected, err := dbwrapper.NewQuery[User]().InsertBatch(users)
if err != nil {
log.Fatal(err)
}
fmt.Printf("批量插入成功,影响行数: %d\n", affected)// 查询单条记录
user, err := dbwrapper.NewQuery[User]().Eq("id", 1).SelectOne()
if err != nil {
log.Fatal(err)
}
fmt.Printf("用户: %+v\n", user)
// 根据ID查询
user, err = dbwrapper.NewQuery[User]().SelectById(1)
if err != nil {
log.Fatal(err)
}
fmt.Printf("用户: %+v\n", user)
// 查询多条记录
users, err := dbwrapper.NewQuery[User]().Eq("status", 1).SelectList()
if err != nil {
log.Fatal(err)
}
fmt.Printf("用户列表长度: %d\n", len(users))
// 条件查询
users, err = dbwrapper.NewQuery[User]().
Like("username", "%john%").
Gt("age", 18).
OrderByDesc("create_time").
SelectList()
if err != nil {
log.Fatal(err)
}
// 分页查询
records, count, err := dbwrapper.NewQuery[User]().SelectPage(1, 10)
if err != nil {
log.Fatal(err)
}
fmt.Printf("总记录数: %d, 当前页记录数: %d\n", count, len(records))
// 指定查询字段
users, err = dbwrapper.NewQuery[User]().Select("id", "username", "email").SelectList()
if err != nil {
log.Fatal(err)
}// 根据ID更新
user := &User{
Id: 1,
Username: "updated_username",
Email: "updated@example.com",
Age: 30,
}
affected, err := dbwrapper.NewQuery[User]().UpdateById(user)
if err != nil {
log.Fatal(err)
}
fmt.Printf("更新成功,影响行数: %d\n", affected)
// 根据条件更新
affected, err = dbwrapper.NewQuery[User]().
Eq("status", 1).
Update(map[string]any{
"status": 0,
"email": "inactive@example.com",
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("条件更新成功,影响行数: %d\n", affected)// 根据ID删除(如果是逻辑删除,会更新删除标志)
affected, err := dbwrapper.NewQuery[User]().DeleteById(1)
if err != nil {
log.Fatal(err)
}
fmt.Printf("删除成功,影响行数: %d\n", affected)
// 条件删除
affected, err = dbwrapper.NewQuery[User]().
Eq("status", 0).
Delete()
if err != nil {
log.Fatal(err)
}
fmt.Printf("条件删除成功,影响行数: %d\n", affected)// 等于
users, _ := dbwrapper.NewQuery[User]().Eq("username", "john").SelectList()
// 不等于
users, _ := dbwrapper.NewQuery[User]().Ne("status", 0).SelectList()
// 大于/小于
users, _ := dbwrapper.NewQuery[User]().Gt("age", 18).Lt("age", 65).SelectList()
// IN查询
users, _ := dbwrapper.NewQuery[User]().In("id", 1, 2, 3, 4, 5).SelectList()
// LIKE查询
users, _ := dbwrapper.NewQuery[User]().Like("username", "%admin%").SelectList()
// BETWEEN查询
users, _ := dbwrapper.NewQuery[User]().Between("age", 18, 65).SelectList()
// NULL/NOT NULL
users, _ := dbwrapper.NewQuery[User]().IsNull("email").SelectList()
users, _ := dbwrapper.NewQuery[User]().NotNull("email").SelectList()
// AND/OR组合条件
users, _ := dbwrapper.NewQuery[User]().
Eq("status", 1).
And(func(q *dbwrapper.DbWrapper[User]) {
q.Gt("age", 18).Lt("age", 65)
}).
OrNest(func(q *dbwrapper.DbWrapper[User]) {
q.Like("username", "%admin%").Eq("role", "admin")
}).
SelectList()// 排序
users, _ := dbwrapper.NewQuery[User]().
OrderBy("username").
OrderByDesc("create_time").
SelectList()
// 分组查询
count, err := dbwrapper.NewQuery[User]().GroupBy("status").Count()
// 去重查询
users, _ := dbwrapper.NewQuery[User]().Distinct().Select("status").SelectList()err := dbwrapper.ExecuteTx(func(tx *sql.Tx) error {
// 在事务中执行多个操作
user1 := &User{Username: "user1", Email: "user1@example.com"}
_, err := dbwrapper.NewQuery[User]().Tx(tx).Insert(user1)
if err != nil {
return err // 事务回滚
}
user2 := &User{Username: "user2", Email: "user2@example.com"}
_, err = dbwrapper.NewQuery[User]().Tx(tx).Insert(user2)
if err != nil {
return err // 事务回滚
}
return nil // 提交事务
})
if err != nil {
log.Printf("事务执行失败: %v", err)
} else {
log.Println("事务执行成功")
}| 标签 | 说明 |
|---|---|
dbw:"primaryKey" |
标识主键字段 |
dbw:"tableLogic" |
标识逻辑删除字段 |
dbw:"autoCreateTime" |
自动填充创建时间(秒级时间戳) |
dbw:"autoCreateTime:milli" |
自动填充创建时间(毫秒级时间戳) |
dbw:"autoUpdateTime" |
自动填充更新时间(秒级时间戳) |
dbw:"autoUpdateTime:milli" |
自动填充更新时间(毫秒级时间戳) |
dbw:"default:value" |
设置默认值 |
dbw:"idType:auto" |
标识自增主键 |
dbw:"idType:assign" |
标识自动分配ID的主键 |
dbw:"tableUpdateStrategy:always" |
标识该字段总是参与更新操作 |
dbwrapper.InitConfig(func(config *dbwrapper.Config) {
config.Db = db // 数据库连接
config.Debug = true // 调试模式,打印SQL语句
config.DriverName = "mysql" // 数据库驱动名称
config.LogicDeleteValue = "1" // 逻辑删除值
config.LogicNotDeleteValue = "0" // 逻辑未删除值
config.GetSnowFlakeMachineId = func() int64 { return 1 } // 雪花算法机器ID
config.GenerateTableId = func() any { return dbwrapper.GetSnowflake().GetId() } // ID生成器
// 自定义分页拦截器
config.PageInterceptor = func(sqlStr string, pageNum int, pageSize int) (finalSql string) {
offset := (pageNum - 1) * pageSize
return sqlStr + fmt.Sprintf(" LIMIT %d OFFSET %d", pageSize, offset)
}
})Select()- 指定查询字段Eq()- 等于Ne()- 不等于Gt()- 大于Ge()- 大于等于Lt()- 小于Le()- 小于等于Like()- LIKE查询In()- IN查询Between()- BETWEEN查询IsNull()- IS NULLNotNull()- IS NOT NULLWhere()- 自定义WHERE条件OrderBy()- 升序排序OrderByDesc()- 降序排序GroupBy()- 分组Having()- HAVING条件Distinct()- 去重SelectOne()- 查询单条记录SelectList()- 查询多条记录SelectById()- 根据ID查询SelectPage()- 分页查询Count()- 统计数量Exist()- 判断是否存在
Insert()- 插入单条记录InsertBatch()- 批量插入InsertBatchSplit()- 分批批量插入
UpdateById()- 根据ID更新Update()- 条件更新
Delete()- 条件删除DeleteById()- 根据ID删除
Tx()- 设置事务Table()- 指定表名WithContext()- 设置上下文And()- AND条件组合Or()- OR条件组合OrNest()- 嵌套OR条件AndIf()- 条件判断ANDOrNestIf()- 条件判断嵌套OR
- 模型定义:确保结构体字段正确设置了数据库标签
- 主键要求:每个模型应至少有一个主键字段
- 逻辑删除:使用逻辑删除时,需要在数据库表中添加相应的删除标记字段
- 事务安全:在事务中操作时,所有相关操作都需要传递相同的事务对象
- 性能考虑:大量数据操作时建议使用批量操作方法
欢迎提交Issue和Pull Request来改进此项目。
MIT License