upgrade: 升级BaseDao, 基于泛型实现
This commit is contained in:
94
base.go
94
base.go
@ -14,45 +14,57 @@ import (
|
|||||||
"gorm.io/gorm/clause"
|
"gorm.io/gorm/clause"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func NewBaseDao[DatabaseDataType any, DatabaseTableColumns any]() *BaseDao[DatabaseDataType, DatabaseTableColumns] {
|
||||||
|
res := &BaseDao[DatabaseDataType, DatabaseTableColumns]{}
|
||||||
|
res.tableName = res.TableName()
|
||||||
|
res.columns = res.Columns()
|
||||||
|
res.isSetColumns = true
|
||||||
|
res.columnComment = res.ColumnComment()
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
// BaseDao 基础dao层
|
// BaseDao 基础dao层
|
||||||
type BaseDao[DatabaseDataType any] struct {
|
type BaseDao[DatabaseDataType any, DatabaseTableColumns any] struct {
|
||||||
TableName string // 继承BaseDao,需要指定表名,后续调用不用传递表名进来,如果分表了,使用SetOption设置表名, 这里的优先级更高
|
tableName string // 继承BaseDao,需要指定表名,后续调用不用传递表名进来,如果分表了,使用SetOption设置表名, 这里的优先级更高
|
||||||
|
isSetColumns bool
|
||||||
|
columns DatabaseTableColumns
|
||||||
|
columnComment map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create 创建新的数据
|
// Create 创建新的数据
|
||||||
func (b *BaseDao[DatabaseDataType]) Create(dbInstance *gorm.DB, data *DatabaseDataType, optionList ...define.SetOption) error {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Create(dbInstance *gorm.DB, data any, optionList ...define.SetOption) error {
|
||||||
o := &define.Option{}
|
o := &define.Option{}
|
||||||
for _, itemFunc := range optionList {
|
for _, itemFunc := range optionList {
|
||||||
itemFunc(o)
|
itemFunc(o)
|
||||||
}
|
}
|
||||||
tableName := b.TableName
|
useTableName := b.tableName
|
||||||
if len(o.Table) > 0 {
|
if len(o.Table) > 0 {
|
||||||
tableName = o.Table
|
useTableName = o.Table
|
||||||
}
|
}
|
||||||
return dbInstance.Table(tableName).Create(data).Error
|
return dbInstance.Table(useTableName).Create(data).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update 更新数据
|
// Update 更新数据
|
||||||
func (b *BaseDao[DatabaseDataType]) Update(dbInstance *gorm.DB, updateData any, optionFuncList ...define.SetOption) (int64, error) {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Update(dbInstance *gorm.DB, updateData any, optionFuncList ...define.SetOption) (int64, error) {
|
||||||
dbInstance = b.setTxCondition(dbInstance, optionFuncList...)
|
dbInstance = b.setTxCondition(dbInstance, optionFuncList...)
|
||||||
r := dbInstance.Updates(updateData)
|
r := dbInstance.Updates(updateData)
|
||||||
return r.RowsAffected, r.Error
|
return r.RowsAffected, r.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateOne 更新一条数据
|
// UpdateOne 更新一条数据
|
||||||
func (b *BaseDao[DatabaseDataType]) UpdateOne(dbInstance *gorm.DB, updateData any, optionFuncList ...define.SetOption) (int64, error) {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) UpdateOne(dbInstance *gorm.DB, updateData any, optionFuncList ...define.SetOption) (int64, error) {
|
||||||
optionFuncList = append(optionFuncList, WithLimit(1, 0))
|
optionFuncList = append(optionFuncList, WithLimit(1, 0))
|
||||||
return b.Update(dbInstance, updateData, optionFuncList...)
|
return b.Update(dbInstance, updateData, optionFuncList...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// List 查询数据列表
|
// List 查询数据列表
|
||||||
func (b *BaseDao[DatabaseDataType]) List(dbInstance *gorm.DB, result []DatabaseDataType, optionFuncList ...define.SetOption) error {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) List(dbInstance *gorm.DB, result *[]*DatabaseDataType, optionFuncList ...define.SetOption) error {
|
||||||
dbInstance = b.setTxCondition(dbInstance, optionFuncList...)
|
dbInstance = b.setTxCondition(dbInstance, optionFuncList...)
|
||||||
return dbInstance.Find(result).Error
|
return dbInstance.Find(result).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListAndTotal 同时查询数据列表和数据总数
|
// ListAndTotal 同时查询数据列表和数据总数
|
||||||
func (b *BaseDao[DatabaseDataType]) ListAndTotal(dbInstance *gorm.DB, listRes []DatabaseDataType, totalRes *int64, disableTotal bool, optionFuncList ...define.SetOption) error {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) ListAndTotal(dbInstance *gorm.DB, listRes *[]DatabaseDataType, totalRes *int64, disableTotal bool, optionFuncList ...define.SetOption) error {
|
||||||
var (
|
var (
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
@ -76,20 +88,20 @@ func (b *BaseDao[DatabaseDataType]) ListAndTotal(dbInstance *gorm.DB, listRes []
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Delete 删除数据, 硬删除, 对应 delete语句
|
// Delete 删除数据, 硬删除, 对应 delete语句
|
||||||
func (b *BaseDao[DatabaseDataType]) Delete(dbInstance *gorm.DB, dataModel DatabaseDataType, optionFuncList ...define.SetOption) (int64, error) {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Delete(dbInstance *gorm.DB, dataModel *DatabaseDataType, optionFuncList ...define.SetOption) (int64, error) {
|
||||||
dbInstance = dbInstance.Model(dataModel)
|
dbInstance = dbInstance.Model(dataModel)
|
||||||
dbInstance = b.setTxCondition(dbInstance, optionFuncList...).Delete(dataModel)
|
dbInstance = b.setTxCondition(dbInstance, optionFuncList...).Delete(dataModel)
|
||||||
return dbInstance.RowsAffected, dbInstance.Error
|
return dbInstance.RowsAffected, dbInstance.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Detail 查询详情
|
// Detail 查询详情
|
||||||
func (b *BaseDao[DatabaseDataType]) Detail(dbInstance *gorm.DB, result *DatabaseDataType, optionFuncList ...define.SetOption) error {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Detail(dbInstance *gorm.DB, result *DatabaseDataType, optionFuncList ...define.SetOption) error {
|
||||||
dbInstance = b.setTxCondition(dbInstance, optionFuncList...)
|
dbInstance = b.setTxCondition(dbInstance, optionFuncList...)
|
||||||
return dbInstance.First(result).Error
|
return dbInstance.First(result).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// DetailByPrimaryID ...
|
// DetailByPrimaryID ...
|
||||||
func (b *BaseDao[DatabaseDataType]) DetailByPrimaryID(dbInstance *gorm.DB, result *DatabaseDataType, primaryID any, primaryKey ...string) error {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) DetailByPrimaryID(dbInstance *gorm.DB, result *DatabaseDataType, primaryID any, primaryKey ...string) error {
|
||||||
primaryKeyField := "id"
|
primaryKeyField := "id"
|
||||||
if len(primaryKey) > 0 {
|
if len(primaryKey) > 0 {
|
||||||
primaryKeyField = primaryKey[0]
|
primaryKeyField = primaryKey[0]
|
||||||
@ -100,12 +112,12 @@ func (b *BaseDao[DatabaseDataType]) DetailByPrimaryID(dbInstance *gorm.DB, resul
|
|||||||
}
|
}
|
||||||
|
|
||||||
// IsNotFound 增加结果是否为数据不存在的判断
|
// IsNotFound 增加结果是否为数据不存在的判断
|
||||||
func (b *BaseDao[DatabaseDataType]) IsNotFound(err error) bool {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) IsNotFound(err error) bool {
|
||||||
return errors.Is(err, gorm.ErrRecordNotFound)
|
return errors.Is(err, gorm.ErrRecordNotFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Count 查询数量
|
// Count 查询数量
|
||||||
func (b *BaseDao[DatabaseDataType]) Count(dbInstance *gorm.DB, optionFuncList ...define.SetOption) (int64, error) {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Count(dbInstance *gorm.DB, optionFuncList ...define.SetOption) (int64, error) {
|
||||||
optionFuncList = append(optionFuncList, WithClearLimit())
|
optionFuncList = append(optionFuncList, WithClearLimit())
|
||||||
dbInstance = b.setTxCondition(dbInstance, optionFuncList...)
|
dbInstance = b.setTxCondition(dbInstance, optionFuncList...)
|
||||||
var cnt int64
|
var cnt int64
|
||||||
@ -113,7 +125,7 @@ func (b *BaseDao[DatabaseDataType]) Count(dbInstance *gorm.DB, optionFuncList ..
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Tx 执行事务
|
// Tx 执行事务
|
||||||
func (b *BaseDao[DatabaseDataType]) Tx(dbInstance *gorm.DB, txFunc func(dbInstance *gorm.DB) error) error {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Tx(dbInstance *gorm.DB, txFunc func(dbInstance *gorm.DB) error) error {
|
||||||
if nil == dbInstance {
|
if nil == dbInstance {
|
||||||
return errors.New("db instance is null")
|
return errors.New("db instance is null")
|
||||||
}
|
}
|
||||||
@ -126,22 +138,22 @@ func (b *BaseDao[DatabaseDataType]) Tx(dbInstance *gorm.DB, txFunc func(dbInstan
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Begin 开启事务
|
// Begin 开启事务
|
||||||
func (b *BaseDao[DatabaseDataType]) Begin(dbInstance *gorm.DB) *gorm.DB {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Begin(dbInstance *gorm.DB) *gorm.DB {
|
||||||
return dbInstance.Begin()
|
return dbInstance.Begin()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Commit 提交事务
|
// Commit 提交事务
|
||||||
func (b *BaseDao[DatabaseDataType]) Commit(db *gorm.DB) error {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Commit(db *gorm.DB) error {
|
||||||
return db.Commit().Error
|
return db.Commit().Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rollback 回滚
|
// Rollback 回滚
|
||||||
func (b *BaseDao[DatabaseDataType]) Rollback(db *gorm.DB) error {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Rollback(db *gorm.DB) error {
|
||||||
return db.Rollback().Error
|
return db.Rollback().Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// setTxCondition 设置查询条件
|
// setTxCondition 设置查询条件
|
||||||
func (b *BaseDao[DatabaseDataType]) setTxCondition(inputTx *gorm.DB, optionFuncList ...define.SetOption) *gorm.DB {
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) setTxCondition(inputTx *gorm.DB, optionFuncList ...define.SetOption) *gorm.DB {
|
||||||
// 构建查询条件
|
// 构建查询条件
|
||||||
o := &define.Option{}
|
o := &define.Option{}
|
||||||
for _, fn := range optionFuncList {
|
for _, fn := range optionFuncList {
|
||||||
@ -157,7 +169,7 @@ func (b *BaseDao[DatabaseDataType]) setTxCondition(inputTx *gorm.DB, optionFuncL
|
|||||||
if len(o.Table) > 0 {
|
if len(o.Table) > 0 {
|
||||||
tx = tx.Table(o.Table)
|
tx = tx.Table(o.Table)
|
||||||
} else {
|
} else {
|
||||||
tx = tx.Table(b.TableName)
|
tx = tx.Table(b.tableName)
|
||||||
}
|
}
|
||||||
|
|
||||||
if nil != o.Model {
|
if nil != o.Model {
|
||||||
@ -246,3 +258,43 @@ func (b *BaseDao[DatabaseDataType]) setTxCondition(inputTx *gorm.DB, optionFuncL
|
|||||||
}
|
}
|
||||||
return tx
|
return tx
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TableName 获取数据表名
|
||||||
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) TableName() string {
|
||||||
|
val := reflect.ValueOf(*new(DatabaseDataType)).MethodByName("TableName").Call(nil)[0]
|
||||||
|
return val.Interface().(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ColumnComment 表字段注释
|
||||||
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) ColumnComment() map[string]string {
|
||||||
|
if len(b.columnComment) > 0 {
|
||||||
|
return b.columnComment
|
||||||
|
}
|
||||||
|
val := reflect.ValueOf(new(DatabaseDataType)).MethodByName("ColumnComment").Call(nil)[0]
|
||||||
|
b.columnComment = val.Interface().(map[string]string)
|
||||||
|
return b.columnComment
|
||||||
|
}
|
||||||
|
|
||||||
|
// Columns 表字段枚举
|
||||||
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) Columns() DatabaseTableColumns {
|
||||||
|
if b.isSetColumns {
|
||||||
|
return b.columns
|
||||||
|
}
|
||||||
|
b.columns = reflect.ValueOf(new(DatabaseDataType)).MethodByName("Columns").Call(nil)[0].Interface().(DatabaseTableColumns)
|
||||||
|
b.isSetColumns = true
|
||||||
|
return b.columns
|
||||||
|
}
|
||||||
|
|
||||||
|
// DetailForAny 查询任意表数据详情
|
||||||
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) DetailForAny(tx *gorm.DB, tableName string, result any, optionList ...define.SetOption) error {
|
||||||
|
optionList = append(optionList, WithTable(tableName))
|
||||||
|
tx = b.setTxCondition(tx, optionList...)
|
||||||
|
return tx.First(result).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListForAny 查询任意表数据列表
|
||||||
|
func (b *BaseDao[DatabaseDataType, DatabaseTableColumns]) ListForAny(tx *gorm.DB, tableName string, data any, optionList ...define.SetOption) error {
|
||||||
|
optionList = append(optionList, WithTable(tableName))
|
||||||
|
tx = b.setTxCondition(tx, optionList...)
|
||||||
|
return tx.Find(data).Error
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user