// 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 }