本文介绍: 这样就可以进行表格增删改查了,不需要一个新增重复增删改查代码了,清晰度会更加明了,其他可以使用的地方还有很多,以后可以多多留心,以后整个代码应该都会焕然一新。在go1.18以前我们实现不同表格增删改查,需要新建很多struct 之后绑定指针类型方法,并且所有不同的表都得重写一遍例如这样;我们如果需要新增表格 就新增TableX 的struct 和 TableWhereX的一样的struct就可以了;如果有100个表,没有泛型支持这里代码需要写100遍,特别的麻烦。

        在go1.18以前我们实现不同表格的增删改查,需要新建很多struct 之后绑定指针类型方法,并且所有不同的表都得重写一遍例如这样;

type UserDao struct {
	BaseDao
}

func (ud *UserDao) GetInfo(tx *gorm.DB, where UserCommonWhere) (info *CompanyWechatUser, err error) {
	info = new(CompanyWechatUser)
	tx = tx.Table(CompanyWechatUser{}.TableName())

	err = ud.CommonWhere(tx, where).Find(&info).Error
	return info, err
}

// GetList
func (ud *UserDao) GetList(tx *gorm.DB, where UserCommonWhere) (list []CompanyWechatUser, err error) {
	tx = tx.Table(CompanyWechatUser{}.TableName())

	err = ud.CommonWhere(tx, where).Find(&list).Error
	return list, err
}

func (ud *UserDao) CommonWhere(tx *gorm.DB, where UserCommonWhere) *gorm.DB {
	if where.ID > 0 {
		tx = tx.Where("id = ?", where.ID)
	}
	if where.UserId != "" {
		tx = tx.Where("user_id = ?", where.UserId)
	}
	if where.OrderBy != "" {
		tx = tx.Order(where.OrderBy)
	}
	return tx
}

如果有100个表,没有泛型支持这里代码需要写100遍,特别的麻烦。

使用泛型进行操作 就很简单,首先创建 一个通用 表格interface 和 where interface 例如

// CommonModelStruct 通用结构type CommonModelStruct interface {
	Table1 | Table2
	TableName() string
	GetID() int
}

// CommonWhereStruct 通用where查询
type CommonWhereStruct interface {
	TableWhere1 | TableWhere2
	Where(*gorm.DB) *gorm.DB
}

之后生成一个通用 的Dao:

// BaseGenericDao 一个model 一个where
type BaseGenericDao[T CommonModelStruct, TT CommonWhereStruct] struct {
}

给dao加入结构体方法:

// Insert 插入
func (b *BaseGenericDao[T, TT]) Insert(tx *gorm.DB, entity T) error {
	return tx.Table(entity.TableName()).Create(&entity).Error
}

// InsertBackID 插入数据返回id
func (b *BaseGenericDao[T, TT]) InsertBackID(tx *gorm.DB, entity T) (int, error) {
	err := tx.Table(entity.TableName()).Create(&entity).Error
	return entity.GetID(), err
}

// Update 更新
func (b *BaseGenericDao[T, TT]) Update(tx *gorm.DB, entity T, updateInfo map[string]interface{}, where TT) error {
	return where.Where(tx.Table(entity.TableName())).Updates(updateInfo).Error
}

// List 列表
func (b *BaseGenericDao[T, TT]) List(tx *gorm.DB, entity T, where TT) ([]T, error) {
	var list []T
	err := where.Where(tx.Table(entity.TableName())).Find(&list).Error
	return list, err
}

// Detail 详情
func (b *BaseGenericDao[T, TT]) Detail(tx *gorm.DB, entity T, where TT) (T, error) {
	var info T
	err := where.Where(tx.Table(entity.TableName())).First(&info).Error
	return info, err
}

// Delete 删除
func (b *BaseGenericDao[T, TT]) Delete(tx *gorm.DB, entity T, where TT) error {
	return where.Where(tx.Table(entity.TableName())).Delete(&entity).Error
}

我们再生成 Table1 | Table2 , TableWhere1 | TableWhere2的通用struct就可以实例化,使用指针结构体方法了:

type Table1 struct {
	ID         int                               `gorm:"primary_key"          json:"id"`
	StartTime  *utils.LocalTime                  `gorm:"start_time"           json:"start_time"` // 订单范围开始
	EndTime    *utils.LocalTime                  `gorm:"end_time"             json:"end_time"`   // 订单范围结束
	CreateTime *utils.LocalTime                  `gorm:"create_time"          json:"create_time"`
	UpdateTime *utils.LocalTime                  `gorm:"update_time"          json:"update_time"`
}

func (Table1) TableName() string {
	return "table1"
}
func (c Table1) GetID() int {
	return c.ID
}

type TableWhere1 struct {
	ID        int
	Unionid   string
	OrderId   string
	StartTime *utils.LocalTime
	EndTime   *utils.LocalTime
	LtEndTime *utils.LocalTime
	GtEndTime *utils.LocalTime
	IsDelete  *int
	Direction utils.SessionHistoryDirectionType
}

// Where 这里不能用指针类型where方法 这样实例化入参的时候 这个方法不符合接口方法
func (c TableWhere1) Where(tx *gorm.DB) *gorm.DB {
	if c.ID > 0 {
		tx = tx.Where("id = ?", c.ID)
	}

	if c.StartTime != nil {
		tx = tx.Where("start_time = ?", c.StartTime)
	}
	if c.EndTime != nil {
		tx = tx.Where("end_time = ?", c.EndTime)
	}
	if c.LtEndTime != nil {
		tx = tx.Where("end_time < ?", c.LtEndTime)
	}
	if c.GtEndTime != nil {
		tx = tx.Where("end_time > ?", c.GtEndTime)
	}
	return tx
}

我们如果需要新增表格 就新增TableX 的struct 和 TableWhereX的一样的struct就可以了;

最后实例写法

var Table1Dao = new(BaseGenericDao[Table1, TableWhere1])

var Table2Dao = new(BaseGenericDao[Table2, TableWhere2])

这样就可以进行表格的增删改查了,不需要一个新增重复增删改查代码了,清晰度会更加明了,其他可以使用的地方还有很多,以后可以多多留心,以后整个代码应该都会焕然一新。

原文地址:https://blog.csdn.net/tongweizhen/article/details/128559604

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_29018.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注