手把手教你開(kāi)發(fā)一套代碼生成器,學(xué)不會(huì)的來(lái)懟我!
?一、介紹
在實(shí)際的軟件項(xiàng)目開(kāi)發(fā)過(guò)程中,我可以很負(fù)責(zé)任的跟大家說(shuō),如果你真的實(shí)際寫代碼的時(shí)間超過(guò)5年,你對(duì)增刪改查這類簡(jiǎn)單的功能需求開(kāi)發(fā),可以說(shuō)已經(jīng)完全寫吐了,至少我就是這種類型的。
但是呢,不可否認(rèn),絕大多數(shù)的軟件功能,向下追隨到最基本的單元,也基本都是單表的增、刪、改、查!
只是隨著用戶需求不斷增多,原來(lái)可能一個(gè)張單表就可以搞定的事情,現(xiàn)在可能需要多張表,或者多個(gè)庫(kù)才能搞定,代碼層就像堆積木一樣,越堆越復(fù)雜。
我記得早期做項(xiàng)目的時(shí)候,項(xiàng)目每新加一張單表,我都需要在代碼層,按照MVC?框架的思想,重新編寫一套CURD的代碼,寫完所有的基礎(chǔ)的增刪改查,至少需要20分鐘,手快的情況下,最快也要10分鐘。
假如某個(gè)新開(kāi)發(fā)的功能,要新增10張表,按照這個(gè)時(shí)間計(jì)算,至少要100分鐘,仔細(xì)想想,其實(shí)你會(huì)發(fā)現(xiàn)大部分的時(shí)間都浪費(fèi)在這些簡(jiǎn)單而又重復(fù)的編程圈子中去了。
那有沒(méi)有一個(gè)辦法,將這些簡(jiǎn)單的CURD代碼,全部都標(biāo)準(zhǔn)化、公共化呢?這樣我們的可以省下很多時(shí)間來(lái)投入業(yè)務(wù)場(chǎng)景的開(kāi)發(fā)。
答案是肯定的,有!
我記得早期我最先接觸的是MybatisGenertor?工具包,通過(guò)這個(gè)工具包,我們可以省去大部分的mybaits中xml?文件的curd編寫工作。
還有我們所熟悉的JPA?,里面有一套公共的持久層動(dòng)態(tài)代理類,它可以自動(dòng)根據(jù)名稱生成SQL語(yǔ)句,能為開(kāi)發(fā)省下不少的事情。
但是我這個(gè)人比較懶,我想搞一個(gè)工具,從controller、service、entity 、dao?層,全部的crud代碼,包括單元測(cè)試類,通過(guò)工具自動(dòng)生成好。
像這樣的工具,現(xiàn)在網(wǎng)上也有不少,例如我們所熟悉的Mybatis-plus插件,它就可以做到這一點(diǎn),也是非常好用。
但是有的公司就不喜歡它,原因也很簡(jiǎn)單,里面的很多公共方法封裝的過(guò)于深入,而且很多crud的sql全部都是動(dòng)態(tài)生成,你根本看不到。
總之啊就是一句,不在自己掌控之內(nèi)的,很多程序員總是帶著各種疑慮~~
當(dāng)然,還有一個(gè)明顯的疑慮,就是對(duì)微服務(wù)的開(kāi)發(fā),不能全面支持,比如你項(xiàng)目采用的是SpringBoot +Dubbo?組合來(lái)開(kāi)發(fā),這個(gè)時(shí)候生成的controller,完全沒(méi)啥用處,而且還很雞肋。
因此在這種情況下,你得基于當(dāng)前的項(xiàng)目軟件開(kāi)發(fā)規(guī)則,自己開(kāi)發(fā)一套代碼生成器,以滿足快速開(kāi)發(fā)的需要。
下面我就簡(jiǎn)單的介紹一下,如何自行開(kāi)發(fā)一套代碼生成器,過(guò)程如下!
二、代碼實(shí)踐
其實(shí)開(kāi)發(fā)一套代碼生成器,真沒(méi)大家想象中的那么復(fù)雜,其中用的最重要一項(xiàng)技術(shù),就是利用模板來(lái)生成代碼,例如我們經(jīng)常使用的模板引擎freemarker,它就可以幫助我們實(shí)現(xiàn)這一點(diǎn)。
2.1、首先我們添加 freemarker 依賴包
2.2、然后創(chuàng)建一個(gè)代碼模版
下面我們以動(dòng)態(tài)創(chuàng)建實(shí)體類為例,編寫一個(gè)實(shí)體類的模板e(cuò)ntity.java.ftl?,其中${}里面定義的是動(dòng)態(tài)變量。
2.3、最后生成目標(biāo)代碼
最后我們基于freemarker編寫一個(gè)測(cè)試類!
運(yùn)行程序,輸出的文件結(jié)果如下!
與預(yù)期的效果一致,成功生成!
以上就是生成代碼最核心的部分,首先編寫一套模板,把需要填充的信息全部定義成動(dòng)態(tài)變量,然后在代碼中,通過(guò)map數(shù)據(jù)格式,使用freemarker進(jìn)行填充!
例如小編我就是采用這種方式,首先把要通過(guò)工具生成的代碼,全部通過(guò)模板方式定義好。
然后通過(guò)連接數(shù)據(jù)庫(kù)的方式,把需要自動(dòng)生成的表結(jié)構(gòu)查詢出來(lái),封裝成數(shù)據(jù)渲染參數(shù),最后傳入到freemarker?中去,非常簡(jiǎn)單、快速的生成與自己預(yù)期想要的代碼,所有單表的crud全部一步到位!
下面這個(gè)就是小編,基于當(dāng)前項(xiàng)目定制開(kāi)發(fā)的一款代碼生成器,項(xiàng)目采用SpringBoot + Dubbo?框架開(kāi)發(fā),沒(méi)有Controller層,截圖中所有的代碼全部都是采用代碼生成器生成的,直接通過(guò)單元測(cè)試就可以運(yùn)行,開(kāi)發(fā)的時(shí)候非???!
由于開(kāi)發(fā)的代碼生成器工具,代碼有點(diǎn)過(guò)多,因此不便于通過(guò)文章分享給大家,有需要的朋友,可以訪問(wèn)如下鏈接獲?。篽ttps://github.com/justdojava/springboot-example-generator
三、小結(jié)
代碼生成器,對(duì)于擅長(zhǎng)以業(yè)務(wù)開(kāi)發(fā)為主的程序員來(lái)說(shuō),絕對(duì)是一個(gè)巨大的福利,它能很明顯的減輕開(kāi)發(fā)人員的工作量,并且提升開(kāi)發(fā)效率,能騰出更多的時(shí)間專注業(yè)務(wù)開(kāi)發(fā)。
實(shí)際上,目前網(wǎng)上已經(jīng)有很多的成熟、穩(wěn)定的代碼生成器,mybatis-plus?就是其中一個(gè)使用非常廣泛的代碼生成器,對(duì)于以單體web開(kāi)發(fā)為主的項(xiàng)目,它完全滿足要求。
當(dāng)然,如果當(dāng)下你沒(méi)有合適的代碼生成器,不妨自己試試開(kāi)發(fā)一款屬于自己的代碼生成器,同樣也可以加倍提升開(kāi)發(fā)效率。
四、參考
1、MyBatis-Plus 文檔