go DbJoinSimple简单封装 本文介绍了一个Go语言实现的数据库查询构建器DbJoinSimple主要用于简化复杂SQL查询的构建过程。该工具支持链式调用提供表连接(JOIN/INNER JOIN)、条件筛选(WHERE)、排序(ORDER BY)和分页(LIMIT/OFFSET)等功能。核心结构包括SimpleQuery(查询条件)、SimplePageSize(分页参数)和SimpleOrders(排序参数)。通过With*方法链式构建查询最终通过WithDb方法生成GORM查询对象。测试用例展示了如何使用该工具进行用户表。。。 https://gitee.com/gowebframe3/webframe.githttps://gitee.com/gowebframe3/webframe/blob/master/gomini/gotool/dbjoinsimple/db_join_simple_test.go DbJoinSimplepackage dbjoindto import ( github.com/samber/lo ) func DefaultPageSize() *SimplePageSize { return defaultPageSize } type SimpleQuery struct { Query string Param []any } type SimplePageSize struct { PageSize int json:pageSize PageCurrent int json:pageCurrent } type SimpleOrders struct { OrderBy string json:orderBy IfAsc bool json:ifAsc } var defaultPageSize SimplePageSize{ PageSize: 10, PageCurrent: 1, } func (self SimpleOrders) ToOrder() string { return self.OrderBy (lo.Ternary(self.IfAsc, asc, desc)) } func (self SimplePageSize) Default() SimplePageSize { return self }package dbjoindto type Users struct { Id int json:id,string Name string json:name Rating int64 json:rating } func newUsers() *Users { return Users{} }DbJoinSimplepackage dbjoinsimple import ( strings gitea.super-study.com/ys-study/gotrain/beapi/data/code/dbjoinsimple/dbjoindto gitea.super-study.com/ys-study/gotrain/beapi/database gitee.com/gowebframe3/webframe.git/goconfig/base/basedto gitee.com/gowebframe3/webframe.git/goconfig/base/basemodel gitee.com/gowebframe3/webframe.git/goconfig/ichublog/golog gorm.io/gorm ) type DbJoinSimple struct { basedto.BaseEntity TableName string json:tableName Select string json:select Joins []dbjoindto.SimpleQuery InnerJoins []dbjoindto.SimpleQuery Where []dbjoindto.SimpleQuery Orders []dbjoindto.SimpleOrders PageSize *dbjoindto.SimplePageSize } func NewDbJoinSimple() *DbJoinSimple { return DbJoinSimple{ Select: *, Where: []dbjoindto.SimpleQuery{}, InnerJoins: []dbjoindto.SimpleQuery{}, Joins: []dbjoindto.SimpleQuery{}, Orders: []dbjoindto.SimpleOrders{}, } } func (self *DbJoinSimple) WithOrder(orderByField string, IfAsc bool) *DbJoinSimple { self.Orders append(self.Orders, dbjoindto.SimpleOrders{ OrderBy: orderByField, IfAsc: IfAsc, }) return self } func (self *DbJoinSimple) WithPageSize(current, size int) *DbJoinSimple { self.PageSize dbjoindto.SimplePageSize{ PageSize: size, PageCurrent: current, } return self } func (self *DbJoinSimple) WithTable(tableName string) *DbJoinSimple { self.TableName tableName return self } func (self *DbJoinSimple) WithSelect(fs string) *DbJoinSimple { self.Select fs return self } func (self *DbJoinSimple) WithJoins(query string, args ...any) *DbJoinSimple { self.Joins append(self.Joins, dbjoindto.SimpleQuery{query, args}) return self } func (self *DbJoinSimple) WithInnerJoins(query string, args ...any) *DbJoinSimple { self.InnerJoins append(self.InnerJoins, dbjoindto.SimpleQuery{query, args}) return self } func (self *DbJoinSimple) WithWhere(query string, args ...any) *DbJoinSimple { self.Where append(self.Where, dbjoindto.SimpleQuery{query, args}) return self } func (self *DbJoinSimple) WithDb(db *gorm.DB) *gorm.DB { db db.Table(self.TableName).Select(self.Select) for i : 0; i len(self.InnerJoins); i { db db.InnerJoins(self.InnerJoins[i].Query) } for i : 0; i len(self.Joins); i { db db.Joins(self.Joins[i].Query) } for i : 0; i len(self.Where); i { db db.Where(self.Where[i].Query, self.Where[i].Param...) } for i : 0; i len(self.Orders); i { db db.Order(self.Orders[i].ToOrder()) } if self.PageSize ! nil { db db.Limit(self.PageSize.PageSize).Offset((self.PageSize.PageCurrent - 1) * self.PageSize.PageSize) } return db } func (self *DbJoinSimple) DbScanJoin(models any) *gorm.DB { if self.PageSize nil { self.PageSize dbjoindto.DefaultPageSize() } var db self.WithDb(database.GetDb()) var orderBy strings.Split(self.Select, ,) return db.Order(orderBy[0]).Scan(models) } func (self *DbJoinSimple) QueryJoin() { var jt DbJoinSimple var users []*dbjoindto.Users var db jt.WithTable(users). WithSelect(users.name,users.id). WithInnerJoins(join user_credits on users.id user_credits.user_id). WithPageSize(1, 3). WithOrder(users.id, true). WithWhere(users.id ?, 1).DbScanJoin(users) golog.Info(basemodel.AdapterFrom(users), db.Error) }testpackage dbjoinsimple import ( testing time gitea.super-study.com/ys-study/gotrain/beapi/database gitea.super-study.com/ys-study/gotrain/beapi/db/dbdao/plandao gitea.super-study.com/ys-study/gotrain/beapi/db/dbdao/userdao gitea.super-study.com/ys-study/gotrain/beapi/db/dbentity/userentity gitea.super-study.com/ys-study/gotrain/beapi/gotool/dbframe/dbaudit/simplemodel gitee.com/gowebframe3/webframe.git/goconfig/base/basedto gitee.com/gowebframe3/webframe.git/goconfig/base/basemodel gitee.com/gowebframe3/webframe.git/goconfig/ichublog/golog gitee.com/gowebframe3/webframe.git/goweb/mapper github.com/stretchr/testify/suite ) type TestDbSingleSuite struct { suite.Suite } func (self *TestDbSingleSuite) SetupSuite() { //code.InitDb() } func (self *TestDbSingleSuite) SetupTest() { } func TestDbSingleSuites(t *testing.T) { suite.Run(t, new(TestDbSingleSuite)) } type user struct { basedto.BaseEntity Id int json:id,string Name string json:name Rating int64 json:rating } func (self *TestDbSingleSuite) Test001_QueryModel2UserJoin() { var jt DbJoinSimple var users []*user var db jt.WithTable(users). WithSelect(users.name,users.id). WithInnerJoins(join user_credits on users.id user_credits.user_id). WithPageSize(1, 3). WithOrder(users.id, true). WithWhere(users.id ?, 1).DbScanJoin(users) golog.Info(basemodel.AdapterFrom(users), db.Error) }package dbjoinsimple import ( gitee.com/gowebframe3/webframe.git/goconfig/base/baseiface gitee.com/gowebframe3/webframe.git/goconfig/basedi github.com/sirupsen/logrus ) /* Title 文件名称: db_join_simple_init.go Desp 描述: 依赖自动注入 Company 公司: www.learn.com Author 作者: raymond163.com 时间: 2026-05-22 16:17:15 Update 作者: raymond163.com 时间: 2026-05-22 16:17:15 */ var singleNameDbJoinSimple *dbjoin.DbJoinSimple-41b7f4e9-db17-43d2-83c7-ffe493a27088 // init register load func init() { registerBeanDbJoinSimple() } // register DbJoinSimple func registerBeanDbJoinSimple() { err : basedi.RegisterLoadBean(singleNameDbJoinSimple, LoadDbJoinSimple) if err ! nil { logrus.Error(register bean error!, err) } } // FindBeanDbJoinSimple func FindBeanDbJoinSimple() *DbJoinSimple { if bean, ok : basedi.FindBeanOk(singleNameDbJoinSimple); ok { return bean.(*DbJoinSimple) } logrus.Error(not find bean!) return nil } func LoadDbJoinSimple() baseiface.ISingleton { var inst NewDbJoinSimple() InjectDbJoinSimple(inst) return inst } func InjectDbJoinSimple(s *DbJoinSimple) { // s.Init() }