OutPath:?“…/dal/query”,
ModelPkgPath:?“…/dal/model”,?//?默認(rèn)情況下會(huì)跟隨OutPath參數(shù),在同目錄下生成model目錄
/*?Mode:?gen.WithoutContext,*/
})
//?復(fù)用工程原本使用的SQL連接配置db(*gorm.DB)
//?非必需,但如果需要復(fù)用連接時(shí)的gorm.Config或需要連接數(shù)據(jù)庫同步表信息則必須設(shè)置
g.UseDB(db)
peopleTbl?:=?g.GenerateModelAs(“people”,?“People”)?//?指定對(duì)應(yīng)表格的結(jié)構(gòu)體名稱
//?為指定的結(jié)構(gòu)體或表格生成基礎(chǔ)CRUD查詢方法,ApplyInterface生成效果的子集
g.ApplyBasic(
model.User{},
peopleTbl,
)
//?為指定的數(shù)據(jù)庫表實(shí)現(xiàn)除基礎(chǔ)方法外的相關(guān)方法,?同時(shí)也會(huì)生成ApplyBasic對(duì)應(yīng)的基礎(chǔ)方法
//?可以認(rèn)為ApplyInterface方法是ApplyBasic的擴(kuò)展版
g.ApplyInterface(func(model.SearchByTenantMethod,model.UpdateByTenantMethod)?{},?//?指定方法interface,可指定多個(gè)
model.Order{},
g.GenerateModel(“Company”),?//?在這里調(diào)用也會(huì)生成ApplyBasic對(duì)應(yīng)的基礎(chǔ)方法
)
//?執(zhí)行并生成代碼
g.Execute()
}
3. 基礎(chǔ)查詢
執(zhí)行生成代碼后,GEN 會(huì)幫助生成基礎(chǔ)的查詢方法,并且綁定到結(jié)構(gòu)體上,可以直接調(diào)用函數(shù)查詢獲取查詢結(jié)果,不需要提前定義變量,參數(shù)和結(jié)構(gòu)體字段類型綁定,防止研發(fā)過程中誤用。
u?:=?query.Use(db).User
u.WithContext(ctx).Select(u.Name,?u.Age).Create(&user)
//?INSERT?INTO?users
?(name
,age
)?VALUES?(“modi”,?18)
user,?err?:=?u.WithContext(ctx).Where(u.Name.Eq(“iDer”),u.Age.Gte(18)).First()
//?SELECT?*?FROM?users?WHERE?name?=?“iDer”?and?age>=18;
_,?err?:=?u.WithContext(ctx).Where(u.ID.Eq(12)).Update(u.Name,?“jinzhu”)
//?UPDATE?users?SET?name=“jinzhu”,?updated_at=‘2013-11-17?21:34:10’?WHERE?id=12;
e.WithContext(ctx).Where(u.ID.Eq(10)).Delete()
//?DELETE?from?users?where?id?=?10;
orders,?err?:=?o.WithContext(ctx).Where(u.Columns(o.Amount).Gt(o.Select(u.Amount.Avg())).Find()
//?SELECT?*?FROM?“orders”?WHERE?amount?>?(SELECT?AVG(amount)?FROM?“orders”);
GEN 滿足了基本上所有的日常使用的查詢方法,包括事務(wù)、關(guān)聯(lián)關(guān)系等高級(jí)用法,更多案例請(qǐng)參考:https://github.com/go-gorm/gen#readme
4. 自定義 SQL 查詢
自定 SQL 的安全性是所有 ORM 最難解決的問題,GEN 使用模板注釋的方法完美解決了這個(gè)問題,只需要將 SQL 注釋到 interface 的方法上。SQL 支持簡(jiǎn)單的 where 查詢和完整 SQL 查詢,條件用Where()
語法包住。Raw SQL 用sql()
包住,也可省略直接寫。
占位符
-
gen.T
用于返回?cái)?shù)據(jù)的結(jié)構(gòu)體,會(huì)根據(jù)生成結(jié)構(gòu)體或者數(shù)據(jù)庫表結(jié)構(gòu)自動(dòng)生成 -
gen.M
表示map[string]interface{}
,用于返回?cái)?shù)據(jù) -
gen.RowsAffected
用于執(zhí)行 SQL 進(jìn)行更新或刪除時(shí)候,用于返回影響行數(shù) -
@@table
?查詢的表名,如果沒有傳參,會(huì)根據(jù)結(jié)構(gòu)體或者表名自動(dòng)生成 -
@@<name>
當(dāng)表名或者字段名可控時(shí)候,用@@占位,name 為可變參數(shù)名,需要函數(shù)傳入。 -
@<name>
當(dāng)數(shù)據(jù)可控時(shí)候,用@占位,name 為可變參數(shù)名,需要函數(shù)傳入
子句
目前支持 if 、where 、set 子句,子句需要用{{}}括起來,并且需要用{{end}}
結(jié)束子句。where 和 set 子句會(huì)幫助做連接詞補(bǔ)全和開頭連接詞刪除。各個(gè)子句支持嵌套使用。
type?Method?interface?{
//?Where(“name=@name?and?age=@age”)
SimpleFindByNameAndAge(name?string,?age?int)?(gen.T,?error)
//?select?*?from?users?where?id=@id
FindUserToMap(id?int)?(gen.M,?error)
//?sql(insert?into?@@table?(name,age)?values?(@name,@age)?)
InsertValue(age?int,?name?string)?error
//?select?name?from?@@table?where?id=@id
FindNameById(id?int)?string
//?select?*?from?@@table
//??{{where}}
//??????id>0
//??????{{if?cond}}id=@id?{{end}}
//??????{{if?key!=“”?&&?value?!=?“”}}?or?@@key=@value{{end}}
//??{{end}}
FindByIDOrCustom(cond?bool,?id?int,?key,?value?string)?([]gen.T,?error)
//?update?@@table
//??{{set}}
//??????update_time=now()
//??????{{if?name?!=?“”}}
//??????????name=@name
//??????{{end}}
//??{{end}}
//??{{where}}
//??????id=@id
//??{{end}}
UpdateName(name?string,?id?int)?(gen.RowsAffected,error)
}
GEN 會(huì)自動(dòng)生成安全的實(shí)現(xiàn)代碼,并且和結(jié)構(gòu)體綁定。使用時(shí)候直接調(diào)用對(duì)應(yīng)的函數(shù)即可。
user,err?:=?u.SimpleFindByNameAndAge(“zhangqiang”,18)
resultMap,err:=?u.FindUserToMap(2)
name?:=?u.FindNameById(5)
users,err?:=?u.FindByIDOrCustom(true,?10,?“name”,?“modi”)
rows,err?:=?UpdateName(“jinzhu”,?12)
5. 最佳實(shí)踐目錄推薦
demo
├──?cmd
│???└──?generate
│???????└──?generate.go?#?包含main函數(shù),執(zhí)行其即可完成生成代碼步驟
├──?dal
│???├──?dal.go?#?實(shí)現(xiàn)具體的數(shù)據(jù)庫連接等操作
│???└──?model
│???│???├──?method.go?#?指定所有自定義查詢方法
│???│???└──?model.go??#?描述與數(shù)據(jù)庫表對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)(體)
│???└──?query??#?生成的代碼存放目錄,?在執(zhí)行代碼生成操作后自動(dòng)創(chuàng)建
│???????└──?gen.go?#?生成的通用查詢代碼
│???????└──?tablename.gen.go?#?生成的單個(gè)表字段和相關(guān)的查詢代碼
├──?biz
│???└──?query.go?#?實(shí)現(xiàn)業(yè)務(wù)邏輯,調(diào)用生成的代碼查詢數(shù)據(jù)庫
├──?config
│???└──?config.go?#?存儲(chǔ)相關(guān)的數(shù)據(jù)庫DSN
├──?generate.sh?#?調(diào)用generate中main函數(shù)生成代碼的腳本(推薦使用)
├──?go.mod
├──?go.sum
└──?main.go
GEN 項(xiàng)目地址
- https://github.com/go-gorm/gen
寫在最后
- GEN 是一個(gè)從開始研發(fā)就立足安全角度的項(xiàng)目,在項(xiàng)目過程中充分考慮業(yè)務(wù)使用的需求,特別是很多 GORM 的功能,GORM 項(xiàng)目已經(jīng)維護(hù)發(fā)展了 8 年,集成了很多業(yè)務(wù)使用的需求。GEN 對(duì) GORM 完全兼容,將 GORM 的所有功能實(shí)現(xiàn)到 GEN 工具中。在安全上,采用了類型安全限制和充分的安全檢查,完全避免了出現(xiàn) SQL 注入問題,在用戶體驗(yàn)上,增加了自動(dòng)同步表結(jié)構(gòu)體功能和一鍵所有查詢相關(guān)代碼生成功能,開發(fā)體驗(yàn)拉滿,快來在你的項(xiàng)目上試試吧?? 。
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)初中級(jí)Android工程師,想要提升技能,往往是自己摸索成長或者是報(bào)班學(xué)習(xí),但對(duì)于培訓(xùn)機(jī)構(gòu)動(dòng)則近萬的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年Android移動(dòng)開發(fā)全套學(xué)習(xí)資料》,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上Android開發(fā)知識(shí)點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄截圖出來,每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且會(huì)持續(xù)更新!
如果你覺得這些內(nèi)容對(duì)你有幫助,可以掃碼獲?。。。▊渥ⅲ篈ndroid)

自學(xué)編程路線、面試題集合/面經(jīng)、及系列技術(shù)文章等,資源持續(xù)更新中…文章來源:http://www.zghlxwxcb.cn/news/detail-853482.html
《Android學(xué)習(xí)筆記總結(jié)+移動(dòng)架構(gòu)視頻+大廠面試真題+項(xiàng)目實(shí)戰(zhàn)源碼》,點(diǎn)擊傳送門即可獲??!
截圖出來,每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且會(huì)持續(xù)更新!**
如果你覺得這些內(nèi)容對(duì)你有幫助,可以掃碼獲?。。。▊渥ⅲ篈ndroid)

自學(xué)編程路線、面試題集合/面經(jīng)、及系列技術(shù)文章等,資源持續(xù)更新中…
[外鏈圖片轉(zhuǎn)存中…(img-woWC819r-1712426857874)]文章來源地址http://www.zghlxwxcb.cn/news/detail-853482.html
《Android學(xué)習(xí)筆記總結(jié)+移動(dòng)架構(gòu)視頻+大廠面試真題+項(xiàng)目實(shí)戰(zhàn)源碼》,點(diǎn)擊傳送門即可獲?。?/strong>
到了這里,關(guān)于無恒實(shí)驗(yàn)室聯(lián)合GORM推出安全好用的ORM框架-GEN的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!