本文介绍了一个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 DbJoinSimple
package 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{} }DbJoinSimple
package 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) }test
package 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 作者: raymond@163.com 时间: 2026-05-22 16:17:15 @Update 作者: raymond@163.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() }