golang泛型实现通用gorm表格增删改查

2 篇文章 0 订阅

        在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])

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用Golang进行增删改查操作时,通常需要使用数据库驱动程序来连接数据库。下面是一个使用Golang进行增删改查的示例: 首先,你需要导入所需的包: ```go import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) ``` 然后,你需要建立数据库连接: ```go db, err := sql.Open("mysql", "用户名:密码@tcp(localhost:3306)/数据库名") if err != nil { // 处理连接错误 } defer db.Close() ``` 接下来,我们可以进行增加、删除、修改和查询操作。 1. 增加数据: ```go stmt, err := db.Prepare("INSERT INTO 表名 (字段1, 字段2) VALUES (?, ?)") if err != nil { // 处理准备语句错误 } defer stmt.Close() _, err = stmt.Exec(值1, 值2) if err != nil { // 处理执行语句错误 } ``` 2. 删除数据: ```go stmt, err := db.Prepare("DELETE FROM 表名 WHERE 条件") if err != nil { // 处理准备语句错误 } defer stmt.Close() _, err = stmt.Exec(参数) if err != nil { // 处理执行语句错误 } ``` 3. 修改数据: ```go stmt, err := db.Prepare("UPDATE 表名 SET 字段1 = ?, 字段2 = ? WHERE 条件") if err != nil { // 处理准备语句错误 } defer stmt.Close() _, err = stmt.Exec(值1, 值2, 参数) if err != nil { // 处理执行语句错误 } ``` 4. 查询数据: ```go rows, err := db.Query("SELECT 字段1, 字段2 FROM 表名 WHERE 条件", 参数) if err != nil { // 处理查询错误 } defer rows.Close() for rows.Next() { var 字段1 类型1 var 字段2 类型2 err := rows.Scan(&字段1, &字段2) if err != nil { // 处理扫描错误 } // 处理查询结果 fmt.Println(字段1, 字段2) } ``` 这些示例代码可以帮助你开始在Golang中进行增删改查操作。请根据你的具体需求进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值