日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

php dao类设计,DAO数据访问对象设计 - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架...

發(fā)布時(shí)間:2023/12/10 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php dao类设计,DAO数据访问对象设计 - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(guān)于DAO數(shù)據(jù)訪問(wèn)對(duì)象設(shè)計(jì)其實(shí)是關(guān)于GoFrame框架工程化實(shí)踐中比較重要一塊設(shè)計(jì)。

DAO設(shè)計(jì)結(jié)合GoFrame的ORM組件性能和易用性都很強(qiáng),可以極大提高開(kāi)發(fā)和維護(hù)效率。看完本章節(jié)內(nèi)容之后,小伙伴們應(yīng)該能夠理解并體會(huì)到使用DAO數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象設(shè)計(jì)的優(yōu)點(diǎn)。

一、現(xiàn)有ORM使用示例

使用作者本廠的案例舉例,本廠是互聯(lián)網(wǎng)醫(yī)療企業(yè),所以示例以醫(yī)生相關(guān)接口做示例。需要提前說(shuō)明的是,這里涉及到的源碼只是方便演示的示例代碼,并不是真正生產(chǎn)使用的源碼。

1、需要定義模型

用戶基礎(chǔ)表(僅作演示,真實(shí)的表有數(shù)十個(gè)字段)

醫(yī)生信息表(僅作演示,真實(shí)的表有上百個(gè)字段)

2、GRPC接口實(shí)現(xiàn)示例

一個(gè)簡(jiǎn)單的GRPC查詢醫(yī)生信息接口。

一個(gè)簡(jiǎn)單的GRPC數(shù)據(jù)查詢接口

二、現(xiàn)有痛點(diǎn)描述

1、必須要定義tag關(guān)聯(lián)表結(jié)構(gòu)與struct屬性,無(wú)法做到自動(dòng)映射

表字段與實(shí)體對(duì)象屬性名稱之間原本就有一定的關(guān)聯(lián)規(guī)則,沒(méi)有必要定義和維護(hù)大量的tag定義。

大量非必要的tag定義,用于指定數(shù)據(jù)表字段到實(shí)體對(duì)象屬性映射

2、不支持通過(guò)返回對(duì)象指定需要查詢的字段

無(wú)法通過(guò)返回的對(duì)象數(shù)據(jù)結(jié)構(gòu)指定查詢字段,要么只能SELECT * ,要么只能通過(guò)額外的方法手動(dòng)錄入查詢字段,效率很低下。

常見(jiàn)的SELECT *操作,無(wú)法根據(jù)接口對(duì)象指定查詢字段

3、無(wú)法對(duì)輸入對(duì)象屬性名稱進(jìn)行自動(dòng)字段過(guò)濾

定義了輸入與輸出數(shù)據(jù)結(jié)構(gòu),輸出的數(shù)據(jù)結(jié)構(gòu)已經(jīng)包含我們需要查詢的字段名稱。開(kāi)發(fā)者輸入定義的返回對(duì)象,期望在查詢的時(shí)候僅查詢我需要的字段名稱,多余的屬性則不會(huì)執(zhí)行查詢,自動(dòng)過(guò)濾掉。

4、需要?jiǎng)?chuàng)建中間查詢結(jié)果對(duì)象執(zhí)行賦值轉(zhuǎn)換

查詢結(jié)果不支持struct智能轉(zhuǎn)換,需要額外定義一個(gè)中間model模型,再通過(guò)其他工具進(jìn)行復(fù)制,效率低。

存在中間臨時(shí)的模型對(duì)象,用于承接查詢結(jié)果及返回結(jié)構(gòu)對(duì)象賦值轉(zhuǎn)換

5、需要提前初始化返回對(duì)象,不管有無(wú)查詢到數(shù)據(jù)

這種方式不僅不優(yōu)雅,對(duì)性能也有影響,還對(duì)GC不太友好。期望查詢到數(shù)據(jù)時(shí)再自動(dòng)創(chuàng)建返回對(duì)象,沒(méi)有查詢到數(shù)據(jù)時(shí)什么都不要做。

需要預(yù)先初始化返回對(duì)象,不管有無(wú)查詢到數(shù)據(jù)

6、沒(méi)有DAO對(duì)象封裝操作

大部分的Golang初學(xué)者似乎都傾向于使用一個(gè)全局的DB對(duì)象,在查詢的時(shí)候通過(guò)DB對(duì)象生成特定表的Model對(duì)象再執(zhí)行CURD操作,這是一種面向過(guò)程的使用方式。這種方式并沒(méi)有代碼分層的設(shè)計(jì)可言,使得數(shù)據(jù)操作和業(yè)務(wù)邏輯高度耦合。

原始數(shù)據(jù)庫(kù)對(duì)象操作方式,沒(méi)有DAO封裝

7、太多的字符串硬編碼,例如表名和字段的硬編碼

舉個(gè)例子,userId這個(gè)字段假如一不小心寫(xiě)成了UserId或者userid,測(cè)試的時(shí)候如果沒(méi)有完全覆蓋到,在一定的條件下才觸發(fā)查詢操作,是不是會(huì)造成新的一場(chǎng)事故呢?

大量的字符串硬編碼

8、不支持鏈路跟蹤

ORM作為關(guān)鍵的功能組件需要支持conetxt傳遞,以便支持鏈路跟蹤。目前無(wú)法傳遞鏈路信息,無(wú)法在日志中打印TraceId等鏈路信息字段。

9、不支持SQL日志輸出

并且需要支持開(kāi)關(guān)功能,當(dāng)出現(xiàn)問(wèn)題的時(shí)候可以定位到具體的SQL,并且可以在日志中看到具體的鏈路信息。

三、改進(jìn)方案設(shè)計(jì)

1、查詢結(jié)果對(duì)象無(wú)需特殊標(biāo)簽定義

2、支持根據(jù)指定對(duì)象自動(dòng)識(shí)別查詢字段,而不是全部SELECT *

3、支持根據(jù)指定對(duì)象自動(dòng)過(guò)濾不存在的字段內(nèi)容

4、使用DAO對(duì)象封裝代碼設(shè)計(jì),通過(guò)對(duì)象方式操作數(shù)據(jù)表

5、DAO對(duì)象將關(guān)聯(lián)的表名及字段名進(jìn)行封裝,避免字符串硬編碼

6、無(wú)需提前定義實(shí)體對(duì)象接受返回結(jié)果,無(wú)需創(chuàng)建中間實(shí)體對(duì)象用于接口返回對(duì)象的賦值轉(zhuǎn)換

7、查詢結(jié)果對(duì)象無(wú)需提前初始化,查詢到數(shù)據(jù)時(shí)才會(huì)自動(dòng)創(chuàng)建

8、支持context輸入,以便支持鏈路跟蹤

9、支持SQL日志輸出能力,支持開(kāi)關(guān)功能

10、數(shù)據(jù)模型、數(shù)據(jù)操作、業(yè)務(wù)邏輯解耦,支持Dao及Model代碼工具化自動(dòng)生成,提高開(kāi)發(fā)效率,便于規(guī)范落地

采用DAO設(shè)計(jì)改進(jìn)后的代碼示例

總結(jié)

以上是生活随笔為你收集整理的php dao类设计,DAO数据访问对象设计 - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。