92 lines
2.3 KiB
Go
92 lines
2.3 KiB
Go
// Package common 公共组件
|
|
package common
|
|
|
|
import (
|
|
"server/config"
|
|
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/clause"
|
|
)
|
|
|
|
// DefaultBatchSize 默认批量操作大小
|
|
const DefaultBatchSize = 100
|
|
|
|
// BaseMapper 泛型 Mapper 基类,封装通用 CRUD 操作
|
|
type BaseMapper[T any] struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
// NewBaseMapper 创建 BaseMapper 实例
|
|
func NewBaseMapper[T any]() *BaseMapper[T] {
|
|
return &BaseMapper[T]{
|
|
db: config.DB,
|
|
}
|
|
}
|
|
|
|
// GetDB 获取数据库实例(允许子类覆盖)
|
|
func (m *BaseMapper[T]) GetDB() *gorm.DB {
|
|
return m.db
|
|
}
|
|
|
|
// FindAll 分页查询
|
|
func (m *BaseMapper[T]) FindAll(page, size int) ([]T, int64, error) {
|
|
var items []T
|
|
var total int64
|
|
query := m.GetDB().Model(new(T))
|
|
query.Count(&total)
|
|
err := query.Offset((page - 1) * size).Limit(size).Find(&items).Error
|
|
return items, total, err
|
|
}
|
|
|
|
// FindByID 根据 ID 查询
|
|
func (m *BaseMapper[T]) FindByID(id string) (*T, error) {
|
|
var item T
|
|
err := m.GetDB().First(&item, "id = ?", id).Error
|
|
return &item, err
|
|
}
|
|
|
|
// Create 创建单个记录
|
|
func (m *BaseMapper[T]) Create(item *T) error {
|
|
return m.GetDB().Create(item).Error
|
|
}
|
|
|
|
// Update 更新单个记录
|
|
func (m *BaseMapper[T]) Update(item *T) error {
|
|
return m.GetDB().Save(item).Error
|
|
}
|
|
|
|
// UpdateFields 更新指定字段
|
|
func (m *BaseMapper[T]) UpdateFields(id string, fields map[string]interface{}) error {
|
|
return m.GetDB().Model(new(T)).Where("id = ?", id).Updates(fields).Error
|
|
}
|
|
|
|
// Delete 删除记录
|
|
func (m *BaseMapper[T]) Delete(id string) error {
|
|
return m.GetDB().Delete(new(T), "id = ?", id).Error
|
|
}
|
|
|
|
// BatchCreate 批量创建
|
|
func (m *BaseMapper[T]) BatchCreate(items []T, batchSize int) error {
|
|
if batchSize <= 0 {
|
|
batchSize = DefaultBatchSize
|
|
}
|
|
return m.GetDB().CreateInBatches(items, batchSize).Error
|
|
}
|
|
|
|
// BatchUpdate 批量更新
|
|
func (m *BaseMapper[T]) BatchUpdate(items []T) error {
|
|
return m.GetDB().Save(items).Error
|
|
}
|
|
|
|
// BatchUpsert 批量插入或更新
|
|
func (m *BaseMapper[T]) BatchUpsert(items []T, updateColumns []string) error {
|
|
return m.GetDB().Clauses(clause.OnConflict{
|
|
Columns: []clause.Column{{Name: "id"}},
|
|
DoUpdates: clause.AssignmentColumns(updateColumns),
|
|
}).CreateInBatches(items, DefaultBatchSize).Error
|
|
}
|
|
|
|
// BatchDelete 批量删除
|
|
func (m *BaseMapper[T]) BatchDelete(ids []string) error {
|
|
return m.GetDB().Delete(new(T), "id IN ?", ids).Error
|
|
} |