欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot整合freemarker實(shí)現(xiàn)代碼生成器

 更新時(shí)間:2023年03月14日 14:25:24   作者:Java極客技術(shù)  
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何整合freemarker實(shí)現(xiàn)一個(gè)簡(jiǎn)單的代碼生成器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

一、介紹

在實(shí)際的軟件項(xiàng)目開(kāi)發(fā)過(guò)程中,我可以很負(fù)責(zé)任的跟大家說(shuō),如果你真的實(shí)際寫(xiě)代碼的時(shí)間超過(guò)5年,你對(duì)增刪改查這類(lèi)簡(jiǎn)單的功能需求開(kāi)發(fā),可以說(shuō)已經(jīng)完全寫(xiě)吐了,至少我就是這種類(lèi)型的。

但是呢,不可否認(rèn),絕大多數(shù)的軟件功能,向下追隨到最基本的單元,也基本都是單表的增、刪、改、查!

只是隨著用戶(hù)需求不斷增多,原來(lái)可能一個(gè)張單表就可以搞定的事情,現(xiàn)在可能需要多張表,或者多個(gè)庫(kù)才能搞定,代碼層就像堆積木一樣,越堆越復(fù)雜。

我記得早期做項(xiàng)目的時(shí)候,項(xiàng)目每新加一張單表,我都需要在代碼層,按照MVC框架的思想,重新編寫(xiě)一套CURD的代碼,寫(xiě)完所有的基礎(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è)工具包,我們可以省去大部分的mybaitsxml文件的curd編寫(xiě)工作。

還有我們所熟悉的JPA,里面有一套公共的持久層動(dòng)態(tài)代理類(lèi),它可以自動(dòng)根據(jù)名稱(chēng)生成SQL語(yǔ)句,能為開(kāi)發(fā)省下不少的事情。

但是我這個(gè)人比較懶,我想搞一個(gè)工具,從controllerservice、entity 、dao層,全部的crud代碼,包括單元測(cè)試類(lèi),通過(guò)工具自動(dòng)生成好。

像這樣的工具,現(xiàn)在網(wǎng)上也有不少,例如我們所熟悉的Mybatis-plus插件,它就可以做到這一點(diǎn),也是非常好用。

但是有的公司就不喜歡它,原因也很簡(jiǎn)單,里面的很多公共方法封裝的過(guò)于深入,而且很多crudsql全部都是動(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ā)一套代碼生成器,以滿(mǎn)足快速開(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 依賴(lài)包

<dependency>
????<groupId>org.freemarker</groupId>
????<artifactId>freemarker</artifactId>
????<version>2.3.23</version>
</dependency>

2.2、然后創(chuàng)建一個(gè)代碼模版

下面我們以動(dòng)態(tài)創(chuàng)建實(shí)體類(lèi)為例,編寫(xiě)一個(gè)實(shí)體類(lèi)的模板entity.java.ftl,其中${}里面定義的是動(dòng)態(tài)變量。

package?${package};

import?java.io.Serializable;

/**
?*?<p>
?*?${tableComment}
?*?</p>
?*
?*?@author?${author}
?*?@since?${date}
?*/
public?class?${entityClass}?implements?Serializable?{

????private?static?final?long?serialVersionUID?=?1L;
????
????<#--屬性遍歷-->
????<#list?columns?as?pro>

????/**
?????*?${pro.comment}
?????*/
????private?${pro.propertyType}?${pro.propertyName};
????</#list>

????<#--屬性get||set方法-->
????<#list?columns?as?pro>
????public?${pro.propertyType}?get${pro.propertyName?cap_first}()?{
????????return?this.${pro.propertyName};
????}

????public?${entityClass}?set${pro.propertyName?cap_first}(${pro.propertyType}?${pro.propertyName})?{
????????this.${pro.propertyName}?=?${pro.propertyName};
????????return?this;
????}
????</#list>
}

2.3、最后生成目標(biāo)代碼

最后我們基于freemarker編寫(xiě)一個(gè)測(cè)試類(lèi)!

public?class?CodeGeneratorDemo?{

????public?static?void?main(String[]?args)?throws?IOException,?TemplateException?{
????????Map<String,?Object>?objectMap?=?new?HashMap<>();
????????//定義包路徑
????????objectMap.put("package",?"com.example.test");
????????//定義實(shí)體類(lèi)
????????objectMap.put("entityClass",?"Student");

????????//定義實(shí)體類(lèi)屬性
????????List<Map<String,?Object>>?columns?=?new?ArrayList<>();
????????//姓名字段
????????Map<String,?Object>?column1?=?new?HashMap<>();
????????column1.put("propertyType",?"String");
????????column1.put("propertyName",?"name");
????????column1.put("comment",?"姓名");
????????columns.add(column1);
????????//年齡字段
????????Map<String,?Object>?column2?=?new?HashMap<>();
????????column2.put("propertyType",?"Integer");
????????column2.put("propertyName",?"age");
????????column2.put("comment",?"年齡");
????????columns.add(column2);

????????//定義類(lèi)的屬性
????????objectMap.put("columns",?columns);
????????//定義作者
????????objectMap.put("author",?"張三");
????????//定義創(chuàng)建時(shí)間
????????objectMap.put("date",?new?SimpleDateFormat("yyyy-MM-dd").format(new?Date()));
????????//定義類(lèi)描述
????????objectMap.put("tableComment",?"學(xué)生信息");

????????//生產(chǎn)目標(biāo)代碼
????????Configuration?configuration?=?new?Configuration(Configuration.VERSION_2_3_23);
????????configuration.setDefaultEncoding(Charset.forName("UTF-8").name());
????????configuration.setClassForTemplateLoading(CodeGeneratorDemo.class,?"/");
????????Template?template?=?configuration.getTemplate("/templates/entity.java.ftl");
????????FileOutputStream?fileOutputStream?=?new?FileOutputStream(new?File("../src/main/java/com/example/generator/Student.java"));
????????template.process(objectMap,?new?OutputStreamWriter(fileOutputStream,?Charset.forName("UTF-8").name()));
????????fileOutputStream.close();
????????System.out.println("文件創(chuàng)建成功");

????}
}

運(yùn)行程序,輸出的文件結(jié)果如下!

package?com.example.test;

import?java.io.Serializable;

/**
?*?<p>
?*?學(xué)生信息
?*?</p>
?*
?*?@author?張三
?*?@since?2021-08-22
?*/
public?class?Student?implements?Serializable?{

????private?static?final?long?serialVersionUID?=?1L;
????

????/**
?????*?姓名
?????*/
????private?String?name;

????/**
?????*?年齡
?????*/
????private?Integer?age;

????public?String?getName()?{
????????return?this.name;
????}

????public?Student?setName(String?name)?{
????????this.name?=?name;
????????return?this;
????}
????public?Integer?getAge()?{
????????return?this.age;
????}

????public?Student?setAge(Integer?age)?{
????????this.age?=?age;
????????return?this;
????}
}

與預(yù)期的效果一致,成功生成!

以上就是生成代碼最核心的部分,首先編寫(xiě)一套模板,把需要填充的信息全部定義成動(dòng)態(tài)變量,然后在代碼中,通過(guò)map數(shù)據(jù)格式,使用freemarker進(jìn)行填充!

例如小編我就是采用這種方式,首先把要通過(guò)工具生成的代碼,全部通過(guò)模板方式定義好。

然后通過(guò)連接數(shù)據(jù)庫(kù)的方式,把需要自動(dòng)生成的表結(jié)構(gòu)查詢(xún)出來(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ò)文章分享給大家,有需要的朋友,可以訪(fǎng)問(wèn)如下鏈接獲?。?a target="_blank">https://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í)間專(zhuān)注業(yè)務(wù)開(kāi)發(fā)。

實(shí)際上,目前網(wǎng)上已經(jīng)有很多的成熟、穩(wěn)定的代碼生成器,mybatis-plus就是其中一個(gè)使用非常廣泛的代碼生成器,對(duì)于以單體web開(kāi)發(fā)為主的項(xiàng)目,它完全滿(mǎn)足要求。

當(dāng)然,如果當(dāng)下你沒(méi)有合適的代碼生成器,不妨自己試試開(kāi)發(fā)一款屬于自己的代碼生成器,同樣也可以加倍提升開(kāi)發(fā)效率。

以上就是SpringBoot整合freemarker實(shí)現(xiàn)代碼生成器的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot freemarker代碼生成器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MyBatis實(shí)戰(zhàn)之Mapper注解的示例

    MyBatis實(shí)戰(zhàn)之Mapper注解的示例

    本文主要介紹了MyBatis實(shí)戰(zhàn)之Mapper注解的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送的詳細(xì)過(guò)程

    SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送的詳細(xì)過(guò)程

    日常開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要使用到郵件發(fā)送任務(wù),比方說(shuō)驗(yàn)證碼的發(fā)送、日常信息的通知等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送的詳細(xì)過(guò)程,需要的朋友可以參考下
    2022-10-10
  • 詳解Jmeter線(xiàn)程組的設(shè)置方法

    詳解Jmeter線(xiàn)程組的設(shè)置方法

    本文主要介紹了Jmeter線(xiàn)程組的設(shè)置方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • VsCode配置java環(huán)境的詳細(xì)圖文教程

    VsCode配置java環(huán)境的詳細(xì)圖文教程

    vscode是一個(gè)免費(fèi)的代碼編輯器,支持多種主題,應(yīng)用起來(lái)簡(jiǎn)單方便,下面這篇文章主要給大家介紹了關(guān)于VsCode配置java環(huán)境的詳細(xì)圖文教程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Java中實(shí)現(xiàn)接口與繼承的區(qū)別及說(shuō)明

    Java中實(shí)現(xiàn)接口與繼承的區(qū)別及說(shuō)明

    這篇文章主要介紹了Java中實(shí)現(xiàn)接口與繼承的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java實(shí)現(xiàn)FIFO任務(wù)調(diào)度隊(duì)列策略

    Java實(shí)現(xiàn)FIFO任務(wù)調(diào)度隊(duì)列策略

    在工作中,很多高并發(fā)的場(chǎng)景中,我們會(huì)用到隊(duì)列來(lái)實(shí)現(xiàn)大量的任務(wù)請(qǐng)求。當(dāng)任務(wù)需要某些特殊資源的時(shí)候,我們還需要合理的分配資源,讓隊(duì)列中的任務(wù)高效且有序完成任務(wù)。本文將為大家介紹通過(guò)java實(shí)現(xiàn)FIFO任務(wù)調(diào)度,需要的可以參考一下
    2021-12-12
  • Idea中maven項(xiàng)目實(shí)現(xiàn)登錄驗(yàn)證碼功能

    Idea中maven項(xiàng)目實(shí)現(xiàn)登錄驗(yàn)證碼功能

    這篇文章主要介紹了Idea中maven項(xiàng)目實(shí)現(xiàn)登錄驗(yàn)證碼功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 解決調(diào)用ftpClient.retrieveFileStream(String?remoteFilePath)第二次讀取為空問(wèn)題

    解決調(diào)用ftpClient.retrieveFileStream(String?remoteFilePath)第二次讀

    這篇文章主要給大家介紹了關(guān)于如何解決調(diào)用ftpClient.retrieveFileStream(String?remoteFilePath)第二次讀取為空問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • Mac安裝Maven的幾種方法小結(jié)

    Mac安裝Maven的幾種方法小結(jié)

    本文主要介紹了Mac安裝Maven的幾種方法小結(jié),主要包括通過(guò)Homebrew安裝Maven,通過(guò)SDKMAN安裝Maven和通過(guò)官方網(wǎng)站下載安裝包安裝Maven,感興趣的可以了解一下
    2024-01-01
  • IDEA mybatis-generator逆向工程生成代碼

    IDEA mybatis-generator逆向工程生成代碼

    這篇文章主要介紹了IDEA mybatis-generator逆向工程生成代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06

最新評(píng)論