golang-yitisheng-server/server/common/base_mapper.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
}