本文介绍: 这样就可以进行表格的增删改查了,不需要一个表新增重复的增删改查代码了,清晰度会更加明了,其他可以使用的地方还有很多,以后可以多多留心,以后整个代码应该都会焕然一新。在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
}
// BaseGenericDao 一个是model 一个where
type BaseGenericDao[T CommonModelStruct, TT CommonWhereStruct] struct {
}
// 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进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。