1. 程式人生 > >突破CRUD | 簡單優雅的程式碼生成工具誕生記(萬字長文慎入)

突破CRUD | 簡單優雅的程式碼生成工具誕生記(萬字長文慎入)

 

0、學習本文你或許可以收穫

1、一個需求從產生、分析到解決的全過程思考
2、簡單的面向物件分析實踐
3、UML類圖實踐
4、設計模式的實踐應用
5、最後收穫一款還算不錯的程式碼生成工具實現思路和原始碼

本文將從上面第一點提到的全過程 需求->目標->思路->設計->實現->總結 逐一展開。

本文為了儘量還原真實場景下如何從無到有實現一個需求,所以全文會假設大家都不動程式碼生成這個東西。是需要從零開始研究的。

下面開始正文。

1、先看需求

某日,風小南(年輕時的自己)程式碼寫的正酣,技術經理突然走了過來,拍拍了風小南肩膀。

“小南啊,你看咱這個系統裡面這麼多增刪改查的功能,雖然拷貝複製可以,但是效率還是不夠高”。

風小南心想

"都CV模式了效率還不高,你咋不上天呢 ?"。

緊接著,技術經理說道

你看,現在這個使用者管理模組做完了,我做其他角色、機構管理時,程式碼的規範、基本的增刪改查結構是一樣的對吧,確實可以快速複製實現其他兩個功能,但是這中間有幾個問題仍然影響效率

 

第一:檔案重新命名問題,一個基本的模組從前臺到後臺大概7-10個左右的程式碼檔案,在複製的同時均需要重新命名,檔案數量這取決於每個公司的開發體系和標準。檔案數量也可以更少,或者更多

 

第二:實體屬性肯定有存在不一樣的吧,需要修改或新增,這有一部分工作量

 

第三:類上,方法上,欄位上的備註都需要調整吧,比如使用者管理類的備註是使用者管理,那你拷貝成角色管理得改成角色管理吧。方法欄位都一樣得調整下吧

 

第四:類中的屬性、方法名、區域性變數等也會需要跟著變化,比如,UserController 注入的UserService,方法內部宣告的userList變數,那拷貝成角色管理對應的名稱均需要調整為 roleXXX

 

第五:多餘不用的方法需要一個個刪除

 

第六:還有個嚴重的問題,就是拷貝完後經常會有人忘了改上面說的幾點內容,導致程式碼可讀性降低。

風小南結合自己實際寫程式碼時的情況還真是存在這樣的問題,不禁感到CV大法在複製整個模組時,還真是不太方便快捷,那怎麼解決呢? 風小南心生疑惑。

“你這兩天給咱研究一下,看行業內還有沒有更有效的解決方案。你先嚐試著弄,有什麼問題咱們隨時溝通(話外音,有什麼進展問題要及時主動彙報)”

說完,技術經理轉身就走了。

哎,故事寫的不好,湊合著看看,核心需求表達到就OK了。

2、初步探索

研究新技術那可是風小南最喜歡的事情了,只不過現在還沒有明確的方向,自己之前也沒有這方面的經驗,這時候能給自己指明道路的就是前輩或搜尋引擎了,作為愛折騰技術的風小南,那必然是先自己搜尋研究一番,短期內沒結果的話在請教下前輩。總之原則就是,不耽擱公司的事情,任務按時完成就OK。

開啟搜尋引擎,咋搜呢? 風小南發現不知道該輸入什麼關鍵字才能找到想要的東西,得先確定下關鍵字。既然是程式碼拷貝相關問題,那假設有相關工具或解決方案之類的東西,應該也會叫 “程式碼XX” 吧。

既然跟效率有關,先來個 “程式碼效率” 搜一波吧。截圖部分圖,結果如下



大概看了下內容,發現都是跟程式碼調優加快執行效率相關,並非提升程式碼開發效率,那就關鍵字不對,還得調整。

風小南又想了想,程式碼拷貝工具? 程式碼複製工具 ?仔細想想應該都不對,但還是嘗試了一波,果然沒有找到想要的結果。

效率不就是要速度快麼,“程式碼快速開發” 這個咋樣呢,再試試。搜尋結果如下

列表出現了一系列快速開發平臺,而且頻繁出現了「程式碼生成」這個詞,直覺告訴風小南這不就是自己心裡想要的那個但不知怎麼表達的那個關鍵詞嗎。風小南又補充了一點既然公司用的是Java,那搜「Java程式碼生成」肯定更準確一點。至此,關鍵字確定了就是「Java程式碼生成」。

操作激動顫抖的雙手,在搜尋引擎敲下了「Java程式碼生成」,點選搜尋。

風小南迫不及待點開幾篇大致瀏覽了下內容,隨後又調整了幾次關鍵字,「Java程式碼生成工具」、「Java程式碼生成器」搜尋查看了一波資料後,看了相關的實現思路,不禁大喜 “這不正是我們需要的東西嗎,自主生成、模板定製、一步到位”。什麼改變數名,重新命名、備註問題統統不存在,風小南心裡大致有譜了。

實現方式大致兩種,一種藉助現成的程式碼生成平臺,第二種就是自主實現,需要藉助模板引擎技術,這裡就存在技術方向的確定,需要跟領導彙報了。

風小南將查閱到的資料和自己的理解整理成文件,發給技術經理(主動及時溝通、彙報很重要),併到技術經理的工位旁進行簡要彙報,技術經理聽完又大致瀏覽了風小南整理的資料,說道:

做的不錯,咱們公司有自己的研發平臺,程式碼生成工具最好是能直接跟咱們現在的平臺融合起來,我看了下現成的程式碼生成工具跟咱現在的平臺不好融合,而且功能太多,使用的技術標準也不太一樣,我們自己實現一套簡單的吧,解決當下核心問題就行,不用太複雜。還是交給你來做吧。

風小南聽到這,那個高興啊。天下還有比擼程式碼更開心的事嗎?有,那就是擼自己不會的程式碼。哈哈。

至此,前期方案的初步探索就完成了。

探索階段的工作往往容易不好把控,原因在於探索那一定是未知的領域、未知的問題,任務本身不具體,不知道最終會做成什麼樣,時間週期可能還長,這時候需要注意的就是自己工作的方式方法。要點就是及時溝通匯報進度。

3、工作任務書

任務有了,大致目標有了,但是還不夠具體,為了防止最後做出的東西跟技術經理想要的不一樣,我還是把剛才談話的內容梳理一下,形成一個明確的工作目標,再找經理確認一下達成一致,再開始。

目標基本上清晰了,用什麼技術,領導說了要容易融入公司的開發平臺,那是要求跟公司現有的技術框架一致,規範一致,哦對,還提到了要簡單易用。於是有了下面的內容。

程式碼生成工具工作任務書

 

工作目標
(1) 核心解決現在程式碼拷貝複製效率低下的問題
(2) 通過自主研發的方式實現一套程式碼生成工具並能夠與公司平臺整合

 

技術選型
(1) springboot
(2) thymeleaf

 

使用方式
(1) 命令列方式使用,不依賴web服務即可使用

風小南把整理的簡要工作目標文件,發給了技術經理,過了一會,技術經理回覆了過來,加了幾項工作目標。

工作目標
(1) 核心解決現在程式碼拷貝複製效率低下的問題
(2) 通過自主研發的方式實現一套程式碼生成工具並能夠與公司平臺整合
(3) 增加新程式碼模板時要易於擴充套件
(4) 可按需生成,如可以只生成Controller檔案,而不是非得全模組程式碼生成

至此,工作目標已確定,下來就是具體幹活了。

領導很忙的時候,如果沒有幫你梳理出具體的任務項,我們需要學會自己梳理,並找領導確認。這也是幫助自己逐步積累的一個過程,以後自己帶人帶團隊這些套路是可以複用、擴充套件的,面向物件嘛,另一方面還能幫領導減壓。領導不會討厭這樣的員工。

5、技術設計

本來風小南都想好了怎麼實現,很快就能做出來,無奈技術經理加了兩條要求,讓這個事情又變得不是那麼簡單,還需分析分析,好好設計一下子。

核心原理圖

既然如此,那還是先把大致的原理圖畫出來吧,這個是核心的實現思路,風小南大致畫了這麼一個圖。


核心原理圖大致是上面這麼一個結構。簡單解釋一下,就是通過讀取資料庫表元資料和程式碼模板,通過thymeleaf引擎將程式碼模板和資料庫元資料進行合併,即將模板表示式替換為具體的資料,最後輸出檔案。

有了這個核心原理後,就需要基於這個結構進行展開設計,來達到後續兩點要求。

(3) 增加新程式碼模板時要易於擴充套件
(4) 可按需生成,如可以只生成Controller檔案,而不是非得全模組程式碼生成

風小南解讀這兩點要求後,得出一個結論:實際上第(3)說的就是要滿足開閉原則,第(4)條是程式要能夠自由組合生成方式,支援個性化自定義。

類圖設計

首先那就需要簡單設計下基本的類圖和關係,怎麼做呢?之前沒有這方面的經驗,想一步到位顯然不太可能,那就得拆解步驟一步步來,分析上面的原理圖,先不用考慮類之間的關係把能想到的類先全部列出來,就是窮舉法,然後逐步優化調整,這是第一步。

做的多了,有了一定經驗可能就用不到窮舉,窮舉法適用於當下沒什麼太好的思路或不知道怎麼開始的情況,相當於在做事的過程中尋找靈感和方法,逐步將自己的思維帶入場景。

以讀取表元資料這個過程舉例來說,要能讀取表元資料,是不是需要一個數據庫連線的類,連結是不是需要配置檔案,讀取配置是否需要個類,讀回來後的表元資料往哪放,是不是也需要表資訊和欄位資訊的類,先不管合理不合理,先列出來。依次類推,其他步驟過程也這麼分析。

簡單普及下元資料
什麼是元資料?即描述資料的資料就叫做元資料,怎麼理解?還是舉個例子簡單點
比如說有個使用者表User,有兩個欄位 id(int) name(String)
那麼描述User表資訊和欄位資訊的資料,就叫做元資料,看下圖


左邊的這條資料表達了右邊使用者表的相關資訊,如這個表叫什麼,什麼型別的,用的什麼儲存引擎,版本等等,這些表述User表資訊的資料就叫做User表的元資料。
同理,欄位也一樣,描述欄位名、欄位型別、欄位長度等等的資料就是欄位的元資料。

 

以Mysql為例,Mysql中建立完成後存在個Schema叫 「information_schema」,這個庫就為mysql的元資料庫,儲存了一些列mysql資料庫例項、表、欄位、索引等等的元資料資訊,裡面就有Tables、Columns表存放表和欄位的元資料。

最終基於程式碼生成工具的核心原理過程,風小南列出了下面自己能想到的類清單

類名用途步驟過程
Table 表元資料資訊 讀取元資料
Column 欄位元資料資訊 讀取元資料
DbConnection 獲取資料庫連結 讀取元資料
YamlRead 讀取YAML配置 讀取元資料
CodeTemplate 模板檔案 讀取模板資訊
Command 生成命令 生成程式碼
TypeMapping 資料庫與Java型別對映類 生成程式碼
GenCode 程式碼生成 生成程式碼
CodeOutput 程式碼輸出 輸出
GenCodeRunner 開發人員使用的入口類 啟動執行

有了基本清單,下來就藉助UML工具進行具體設計,風小南所在公司所有設計均使用的是PowerDesign。

類圖初版

風小南認為既然是初版那定然是把大的邊界,基本關係先勾勒出來,起到鎖住邊界和找出關鍵要素的作用,基本上來說就是把上面列出的類先畫出來標上簡單的關係,於是有了下圖

 

 

類圖0.1版

基本雛形有了,下面就是對著雛形逐步思考每個過程,填充類的屬性、方法,檢查是否有遺漏,設計不合理的地方進行調整,調整後如下


幾個關鍵點設計

1 、GenCodeRunner
GenCodeRunner僅一個方法,就是run,run內部呼叫GenCode物件,為什麼需要GenCodeRunner,因為任務目標中為了簡化使用,該程式碼生成工具會使用命令列方式,那命令列控制這部分邏輯應該與核心業務剝離開,畢竟後面可能更換其他使用方式,比如http、gui等都有可能,如果寫在核心業務邏輯中,那就不方便更換使用方式了,那麼提供一個獨立的執行類來接收使用者輸入實現與使用者互動是有必要的。

2、MetaData
這個類在之前初版分析時,並沒有,新增這個類是覺得GenCode沒必要知道資料庫的相關細節,對於GenCode來說它需要的僅僅是元資料,怎麼鏈資料庫怎麼讀配置,它不應該關心,所以這些事情就交給了MetaData。

3、Table、Column
這兩個類中分別添加了一個類屬性,Table中添加了className,Column中添加了attrName,由於資料庫大部分情況下命名標準為下劃線分割形式,如user_id,而類中為駝峰式名,如userId,所以為了生成程式碼的模板表示式足夠簡單,不處理什麼邏輯,雖說模板表示式也可以實現這樣的轉化,但模板就該幹模板該乾的事,就是展示資料,因此將user_id -> userId 這一過程消滅在MetaData中,所以分別提供了符合類和屬性命名規範的屬性。

按說應該分開,單獨定義類和屬性資訊的類,但此處並不考慮留太多的可擴充套件空間,為了避免引入過多的類,導致設計變得複雜,因此合併到一個類中。

類圖0.2版

經過0.1版的設計,風小南感覺整體結構基本清晰了,下來就是需要找到中間存在的變化點,將可能存在變化的地方進行抽象,這樣就能避免程式碼修改或新增時帶來的內部調整。對修改關閉,對新增開放,開閉原則。即滿足技術經理的第3條要求。

風小南經過分析,發現就目前公司的實際情況來看,可能發生變化的地方主要在模板可能會隨時調整新增,那麼就會引呼叫類GenCodeRunner的變化,從而引起Command類進行調整,還有一處就是程式碼生成完後的輸出方式,現在可能輸出到檔案,未來如果想輸出到資料庫、命令列也不是不可能。經過上面的思考,風小南對上面提到的幾處內容分別進行了抽象設計,形成了下圖。

幾個關鍵點設計

1 、Command
Command設計成了介面,對於不同模板的生成,提供不同的生成命令,可提供組合生成命令,即一次生成模組所有程式碼。

2、CodeOutout
Codeout調整為介面,針對不同輸出形式提供不同的實現類。

3、CodeTemplate
CodeTemplate設計為基類,針對不同的模板檔案提供不同的擴充套件子類。

如此設計對於GenCode核心類來說,它操作的相關類都是介面或基類,那麼這個層面就可以做到基本穩定,不管實現層如何變化,該層都不會受到影響。

類圖0.3版

總體結構已經成型,但是風小南突然發現,Command類的位置貌似放的不太合適,命令應該是有使用者觸發,而不是GenCode,那麼使用者如何觸發,唯一入口在GenCodeRunner,那麼,Command是不是在GenCodeRunner處更合適。於是風小南再次調整了Command類的位置。

Command可以是單個生成命令,可以進行多個生成命令進行組合形成一個命令,如此就滿足了技術經理要求的第4條,程式要能夠自由組合生成方式,支援個性化自定義。最終得到的結果如下圖。

 

 

幾個關鍵點設計

1 、GenCodeRunner
GenCodeRunner 根據使用者的輸入,會例項化對應的Command物件,呼叫GenCode的gen方法。

2 、GenCode
GenCode中原理的gen方法是無輸入引數的,調整後,gen方法接收一個生成命令,進行具體的程式碼生成。

類圖0.4版

類關係都處理妥當,但是還有一個點遺漏掉了,風小南突然想到,像TypeMapping這種類,如果初始預設值無法滿足要求,那得允許使用者自己定義呀,嗯,還缺個全域性層面的配置類。

目前是隻有TypeMapping一個,倒是可以讓使用者直接通過該類方法進行擴充套件自定義,但是後面可能會有其他配置項,如果將這些配置介面都丟擲給使用者,使用者使用複雜度不就增加了,那麼多配置介面他哪記得住,所以提供一個全域性配置的入口類還是很有必要的,不管什麼層面的配置自定義,都可以通過該配置類實現。使用者只需記住這個全域性的配置類就可以了。

就叫它GenCodeConfiguration吧,類圖新增成員,最終完整設計如下。

 

 

設計完結

至此設計工作結束,下面就可以依據類圖設計,進行實現了,或許你感覺這麼簡單個玩意,折騰這麼多類,累不累,我兩三個類就可以搞定了,沒錯,可以搞定,但是要解耦、可擴充套件、易維護,怎麼實現每個過程可被替換?這就需要更多的介面、抽象類、面向物件的設計思想、設計模式的應用才能實現。其實上面的類設計還可以更復雜,只是當下我們的需求就這麼多,目前的設計足矣。

如此,是不是有點感覺spring為什麼會整的那麼複雜,一些開源框架實現的功能可能明明很簡單為什麼搞那麼多介面,繼承,目的就是為了解耦、可擴充套件、易維護,內部實現可自定義替換。

或許你還是感覺沒啥必要,那你要這麼想,不從這些小的工具、程式碼中去一點點磨鍊自己的程式設計思維,加深對面向物件設計的理解,那什麼時候去練,沒有前面小的積累,你能一步去實現個Mybatis嗎? 不積跬步無以至千里,所以,經過小場景的鍛鍊,不斷積累,不斷突破嘗試,才有可能設計出更完善更好的工具或框架。

6、實現過程

核心原理清楚了,設計有了,對風小南來說剩下編碼就是最容易的事了。當然對於剛入行的年輕人來說,可能實現也存在一定的障礙,這個障礙主要是見的少,寫的少,純程式碼的編寫能力還不能夠駕輕就熟,缺少程式碼經驗。解決辦法就是帶著腦子多練。

需要注意一點的是,上面的設計並非最終版,因為具體實現的過程中可能還會發現一些設計時考慮不到的內容,所以設計跟實現是一個相互促進完善的過程,畢竟不動手,有些細節情況是考慮不到的,更何況本文並非是作者提前準備好才寫的,而是為了儘量還原真實過程,邊實現,邊輸出文章。

程式碼實現首要做的就是定義專案包結構。實際上就是對設計中的類進行歸類建程式碼包。經過分析後基本形成包結構如下


剩下的事情就是對每個類進行分別實現。從哪開始呢,可以順著實際程式碼執行的過程一步步實現。到哪一步需要哪些類配合,再對需要的類實現。風小南畫出了整體程式碼執行過程如下圖。


實現部分就以包為單位講下大致的實現思路,關鍵位置的程式碼簡要貼上一點配合說明,其他內容就不一行行程式碼進行貼上了,完整程式碼隨後會上傳至Github。

GenCodeRunner

命令列互動類,核心作用一個是初始化全域性配置和GenCode,另一個作用是接收使用者輸入,通過互動確定使用者需要生成程式碼的命令和輸出方式。關鍵程式碼如下。

Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("\n");

// 初始化程式碼生成配置
GenCodeConfiguration genCodeConfiguration = new GenCodeConfiguration();
GenCode genCode = new GenCode(genCodeConfiguration);

// 控制使用者互動過程
Command command = this.selectCommand(genCodeConfiguration,scanner);
CodeOutput output = this.selectOutput(genCodeConfiguration,scanner);
String tableName = this.selectTableName(scanner);

// 生成
Console.log("\n");
Console.log("開始生成....");
genCode.process(tableName,command,output);
Console.log("生成完成....");

GenCode

核心類,協調各方資源獲取命令需要的相關引數,呼叫Command執行程式碼生成。核心程式碼如下。

public void process(String tableName,Command command,CodeOutput codeOutput){
        Table tableInfo = MetaData.getTableInfo(tableName,configuration.getTypeMapping());
        command.execute(tableInfo,springTemplateEngine,codeOutput);
}

此處實現與設計存在一點差異,設計中模板的獲取是在GenCode中,但實際實現時發現放在Command中更合適,此處做了調整,具體到Command包時再看。

command

命令包,用於實現各種程式碼的生成實現,看下整個包的類圖結構



整體分為單命令和組合命令兩種,目前單命令實現了Controller、Entity、Vo三種,其他可以任意擴充套件實現,組合命令實現了一次性生成Controller與Entity,同樣可以任意自定義擴充套件。

看個單命令的核心程式碼

public class GenControllerCommand extends SingleCommand {

    public GenControllerCommand() {
        this.commandName = "Controller生成命令";
        this.commandCode = "01";
        this.template = new ControllerCodeTemplate();
    }

    @Override
    public void process(Table table, Map map) {
       // 留給使用者自定義處理過程,比如一些自定義引數的處理加一些控制等等,此處暫不需要
    }
}

定義命令名稱,命名程式碼(用於與使用者互動輸入的命令程式碼對應),繫結對應的程式碼生成模板。預留process函式的作用時在生成具體程式碼前提供給使用者自行在對資料進行二次加工或處理些其他需要的邏輯。command包結合使用了命令模式和模板方法。

在看下組合命令的核心程式碼

// 摘自GenControllerAndEntityCommand
public GenControllerAndEntityCommand() {
    this.commandName = "Controller & Entity 生成命令";
    this.commandCode = "03";
    singleCommands.add(new GenControllerCommand());
    singleCommands.add(new GenEntityCommand());
}

// 摘自 ComposeCommand
// 執行命令
@Override
public void execute(Table table, SpringTemplateEngine springTemplateEngine, CodeOutput codeOutput){
    for(SingleCommand singleCommand : singleCommands){
        singleCommand.execute(table,springTemplateEngine,codeOutput);
    }
}

組合命令是集多個單命令的集合體,執行過程即遍歷挨個呼叫每個單命令的執行方法,完全複用單命令。

configuration

全域性配置類,提供預設引數配置和使用者自定義擴充套件配置。主要完成了命令註冊配置、輸出型別註冊配置、資料庫與Java型別對映配置。

所有配置的入口均在GenCodeConfiguration中,統一入口可以方便呼叫,減少使用者的記憶負擔。框架內部也能達到集中管控的目的。

db

此包較為簡單,封裝了資料庫連接獲取的過程,主要包含一個配置類和一個連接獲取類,比較簡單,此處就不展開說明了。

exception

為程式碼生成模組定義了統一的異常類GenCodeException,程式碼生成模組的異常均會被包裝為該異常丟擲。

meta

資料表、欄位元資料獲取包,主要處理邏輯是讀取資料庫元資料包裝為Java對應的Table、TableColumn物件。

// 表元資料
Statement stmt = conn.createStatement();
String sql = "select table_comment from information_schema.tables where table_name = '"+ tableName + "'";
ResultSet tableResultSet = stmt.executeQuery(sql);
while (tableResultSet.next()) {
        table.setComment(tableResultSet.getString("table_comment"));
        break;
}

// 欄位元資料
DatabaseMetaData metaData = conn.getMetaData();
ResultSet resultSet = metaData.getColumns(null, null, table.getCode(), "%");
List<TableColumn> tableColumnList = CollectionUtil.newArrayList();
while (resultSet.next()) {
    TableColumn tableColumn = new TableColumn();
    tableColumn.setCode(resultSet.getString("column_name").toLowerCase());
    tableColumn.setType(typeMapping.getJavaType(resultSet.getString("type_name")));
    tableColumn.setComment(resultSet.getString("remarks"));
    tableColumnList.add(tableColumn);
}
table.setColumnList(tableColumnList);

output

輸出包主要實現最終生成程式碼的輸出形式,目前實現了控制檯輸出和檔案輸出,看下類結構。

 

 


比較簡單,簡單的繼承結構,大概看下實現程式碼
// 摘自 ConsoleOutput
@Override
public void out(Table table, String content, CodeTemplate template) {
    Console.log("\n");
    Console.log("-----------------------------");
    Console.log(content);
    Console.log("-----------------------------");
}

// 摘自 FileOutput
@Override
public void out(Table table, String content, CodeTemplate template) {
    String fileName = "dist/" + table.getClassName() + template.getFileTag() + template.getFileSuffix();
    File file = new File(fileName);
    FileUtil.writeBytes(content.getBytes(),file);
    Console.log("檔案位置:" + file.getAbsolutePath());
}

template

生成程式碼的模板定義類,沒有多餘的邏輯控制,就是模板屬性和模板對應最終生成檔案相關屬性的定義。



看個控制器程式碼模板的定義
public ControllerCodeTemplate() {
        this.tplName = "控制器模板";
        this.tplPath = "templates/Controller.tpl";
        this.fileTag = "Controller";
        this.fileSuffix = ".java";
}

tpl

具體的模板檔案,使用的是thymeleaf的text模式,看個簡單的模板內容

/**
* [(${comment})]-實體
*
* @author yuboon
* @version v1.0
* @date [(${createDate})]
*/
@Data
public class [(${className})] implements Serializable {
    [# th:each="column : ${columnList}"]
    /** [(${column.comment})]  */
    @Column("[(${column.code})]")
    private [(${column.type})] [(${column.attrName})];
    [/]
}

7、使用體驗

命令列互動方式

自定義呼叫

public class GenCodeTest {
    public static void main(String[] args) {
        GenCodeConfiguration genCodeConfiguration = new GenCodeConfiguration();
        GenCode genCode = new GenCode(genCodeConfiguration);
        genCode.process("sys_user",new GenVoCommand(),new ConsoleOutput());
    }
}

基於此結構改造為GUI方式獲取Web網頁方式均很容易。

擴充套件一個新模板

很簡單,定義個新的Command、新的Tpl模板檔案、CodeTemplate模板定義檔案,通過全域性配置註冊新Command,整個過程對已有程式碼沒有任何改動。

8、總結

相關推薦

突破CRUD | 簡單優雅程式碼生成工具誕生長文

  0、學習本文你或許可以收穫 1、一個需求從產生、分析到解決的全過程思考2、簡單的面向物件分析實踐3、UML類圖實踐4、設計模式的實踐應用5、最後收穫一款還算不錯的程式碼生成工具實現思路和原始碼 本文將從上面第一點提到的全過程 需求->目標->思路->設計->實現->

java中的程式碼生成工具簡單羅列

Java中也有類似於codesmith的程式碼生成工具,不過開源的或免費的挺多,以下簡單介紹: 1.spring roo   spring官方專案之一。 2.m2Spring   貌似商業的。 3.springside    國產的,作者csdn江南白衣 4.rapid

程式碼生成工具lombok的簡單使用

1、為eclipse安裝lombok外掛            將lombok.jar 拷入F盤  (隨意位置並不一定非要F盤)            進入cmd命令視窗輸入f:切換到F盤       

mybatis程式碼生成工具 mybatis-generator

            mybatis-generator-1.0使用手冊 1.    編寫目的 1.1.前面的話 每個專案開始,都會寫到servi

使用程式碼生成工具Database2Sharp快速生成工作流模組控制器和檢視程式碼

在前面隨筆《基於Metronic的Bootstrap開發框架--工作流模組功能介紹》和《基於Metronic的Bootstrap開發框架--工作流模組功能介紹(2)》中介紹了Bootstrap開發框架的工作模組功能,前面文章也提及,通過程式碼生成工具直接生成對應的Create、ViewDetail、Index

Telosys:程式碼生成工具

在本文中,我們將檢查泰羅西斯,一個程式碼生成工具。我們會通過和作者談話來做到這一點,洛朗·蓋林。這將使我們有可能瞭解他對程式碼生成的看法,以及使用者通過使用Telosys實現了什麼。 為什麼程式碼生成工具相關?程式碼生成是模型驅動開發中最簡單和最常用的技術。我們使用一種資訊源,一種模型形式,並將其與一些模板

簡單的流水生成 工具

package com.sumainfo.util; import java.text.SimpleDateFormat; import java.util.Date; /**  * 流水號生成工具類  * @author Mfx  * @data 208-8-31  *

【Java工具推薦】Generator:Java程式碼生成工具

歡迎來到 Generator 寫這個程式碼生成器工具的想法源自2018年3月份,當時專案組剛完成一個Java Web專案的研發工作,在整個專案過程中耗費了不少的時間來構建SpringMVC的重複性程式碼和Mybatis的對映檔案,同時我也越來越覺得這些重複且難度不大的工作不

k8s中,通過程式碼生成工具生成的controller中加入控制邏輯

摘自http://www.infoq.com/cn/articles/kubernetes-status-management-and-extension 前文自動生成的程式碼中為Bee生成了預設的BeeController,如圖1.2.2所示。 當監聽到建立或更新Bee狀態的時候,可

簡單程式碼生成程式

Problem Description 通過三地址程式碼序列生成計算機的目的碼,在生成演算法中,對暫存器的使用順序為:暫存器中存有 > 空暫存器 > 記憶體中存有 > 以後不再使用 > 最遠距離使用 Input 單組輸入,給定輸出的三地址程式

mybatis-generator程式碼生成工具

1、pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/

Spring MVC 典型分層Java程式碼生成工具

本文目的: 企業應用開發實際過程中必不可少的步驟是對資料庫表進行增刪查改,相應的java程式碼基本實現都需要不停拼接資料庫欄位。為了減少程式設計師重複勞動,本文嘗試編寫工具類基於資料表字段生成基本的java的實體類模板,controller類模板,ser

dalgen程式碼生成工具

https://www.jianshu.com/p/e2b5d5a16bf0 1.    簡介         目前專案中的common-dal層程式碼還是主要靠人工去寫,這就引入一個問

.net常用的程式碼生成工具

之前很多從事C#開發的用過動軟程式碼生成器,然後隨著IT技術的快速發展,湧現出很多優秀的工具關於.Net的,首推微軟的Entity Framework,其次是NHibernate。Entity Framework是微軟親兒子,和微軟自家的Sql Server整合得很好,支援功能強大的Linq。NHiberna

Spring框架全自動程式碼生成工具

在專案的不同階段,都有相應的程式碼生成工具,而想實現全自動程式碼生成,則比較困難。 【架構師助手】就是針對這一需求,程式設計師只需輸入業務資料模型,【架構師助手】在10秒鐘內就可以為你生產出一個基本功能完備、可立即執行並看到實際效果的業務資訊化系統軟體(包括前端web頁面與後端業務程式碼)。

10 個超棒的 CSS3 程式碼生成工具

以下資源是完全免費的web應用,可用於生成圖案、漸變、甚至瀏覽器字首屬性的CSS3程式碼。如果你寫的是前端程式碼,然後這些資源可以為你節省大量的時間,併為今後的專案工作提供可重複片段。 1. CSS3 Generator 大家最喜愛的用於程式碼生成的web應用之一就是CSS3 Gener

程式碼生成工具generator

這裡僅僅貼配置程式碼,不說安裝 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE generatorConfiguration 3 PUBLIC "-//mybatis.org//DTD MyBatis

通用mybatis mapper程式碼生成工具

以下介紹的是針對通用tk mybatis 程式碼生成方法 1.依賴引入 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId>

基於Metronic的Bootstrap開發框架經驗總結18-- 在程式碼生成工具Database2Sharp中整合對Bootstrap-table外掛的分頁及排序支援

在我們開發系統介面,包括Web和Winform的都一樣,主要的介面就是列表展示主介面,編輯檢視介面,以及一些輔助性的如匯入介面,選擇介面等,其中列表展示主介面是綜合性的資料展示介面,一般往往需要對記錄進行合理的分頁,整合各種增刪改查的按鈕等功能。隨著開發專案的需求變化,對資料記錄分頁展示、排序等功能都是常態的

spring-boot 程式碼生成工具

Mybatis Auto Code Generation Mapper/Service/Domain/SQL.xml, 主要是針對某個資料庫所有表[參考配置檔案ConfigConstants], 統一生成Domain/Service/Mapper,以及SQL.xml檔案, 如