自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

手把手教你開發(fā)代碼生成器,學(xué)不會(huì)的來懟我!

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

[[418900]]

一、介紹

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

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

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

我記得早期做項(xiàng)目的時(shí)候,項(xiàng)目每新加一張單表,我都需要在代碼層,按照MVC框架的思想,重新編寫一套CURD的代碼,寫完所有的基礎(chǔ)的增刪改查,至少需要20分鐘,手快的情況下,最快也要10分鐘。

假如某個(gè)新開發(fā)的功能,要新增10張表,按照這個(gè)時(shí)間計(jì)算,至少要100分鐘,仔細(xì)想想,其實(shí)你會(huì)發(fā)現(xiàn)大部分的時(shí)間都浪費(fèi)在這些簡(jiǎn)單而又重復(fù)的編程圈子中去了。

那有沒有一個(gè)辦法,將這些簡(jiǎn)單的CURD代碼,全部都標(biāo)準(zhǔn)化、公共化呢?這樣我們的可以省下很多時(shí)間來投入業(yè)務(wù)場(chǎng)景的開發(fā)。

答案是肯定的,有!

我記得早期我最先接觸的是MybatisGenertor工具包,通過這個(gè)工具包,我們可以省去大部分的mybaits中xml文件的curd編寫工作。

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

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

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

但是有的公司就不喜歡它,原因也很簡(jiǎn)單,里面的很多公共方法封裝的過于深入,而且很多crud的sql全部都是動(dòng)態(tài)生成,你根本看不到。

總之啊就是一句,不在自己掌控之內(nèi)的,很多程序員總是帶著各種疑慮~~

當(dāng)然,還有一個(gè)明顯的疑慮,就是對(duì)微服務(wù)的開發(fā),不能全面支持,比如你項(xiàng)目采用的是SpringBoot +Dubbo組合來開發(fā),這個(gè)時(shí)候生成的controller,完全沒啥用處,而且還很雞肋。

因此在這種情況下,你得基于當(dāng)前的項(xiàng)目軟件開發(fā)規(guī)則,自己開發(fā)一套代碼生成器,以滿足快速開發(fā)的需要。

下面我就簡(jiǎn)單的介紹一下,如何自行開發(fā)一套代碼生成器,過程如下!

二、代碼實(shí)踐

其實(shí)開發(fā)一套代碼生成器,真沒大家想象中的那么復(fù)雜,其中用的最重要一項(xiàng)技術(shù),就是利用模板來生成代碼,例如我們經(jīng)常使用的模板引擎freemarker,它就可以幫助我們實(shí)現(xiàn)這一點(diǎn)。

2.1、首先我們添加 freemarker 依賴包

  1. <dependency> 
  2.     <groupId>org.freemarker</groupId> 
  3.     <artifactId>freemarker</artifactId> 
  4.     <version>2.3.23</version> 
  5. </dependency> 

 

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

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

  1. package ${package}; 
  2.  
  3. import java.io.Serializable
  4.  
  5. /** 
  6.  * <p> 
  7.  * ${tableComment} 
  8.  * </p> 
  9.  * 
  10.  * @author ${author} 
  11.  * @since ${date
  12.  */ 
  13. public class ${entityClass} implements Serializable { 
  14.  
  15.  private static final long serialVersionUID = 1L; 
  16.   
  17.  <#--屬性遍歷--> 
  18.  <#list columns as pro> 
  19.  
  20.  /** 
  21.   * ${pro.comment} 
  22.   */ 
  23.  private ${pro.propertyType} ${pro.propertyName}; 
  24.  </#list> 
  25.  
  26.  <#--屬性get||set方法--> 
  27.  <#list columns as pro> 
  28.  public ${pro.propertyType} get${pro.propertyName?cap_first}() { 
  29.   return this.${pro.propertyName}; 
  30.  } 
  31.  
  32.  public ${entityClass} set${pro.propertyName?cap_first}(${pro.propertyType} ${pro.propertyName}) { 
  33.   this.${pro.propertyName} = ${pro.propertyName}; 
  34.   return this; 
  35.  } 
  36.  </#list> 

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

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

  1. public class CodeGeneratorDemo { 
  2.  
  3.     public static void main(String[] args) throws IOException, TemplateException { 
  4.         Map<String, Object> objectMap = new HashMap<>(); 
  5.         //定義包路徑 
  6.         objectMap.put("package""com.example.test"); 
  7.         //定義實(shí)體類 
  8.         objectMap.put("entityClass""Student"); 
  9.  
  10.         //定義實(shí)體類屬性 
  11.         List<Map<String, Object>> columns = new ArrayList<>(); 
  12.         //姓名字段 
  13.         Map<String, Object> column1 = new HashMap<>(); 
  14.         column1.put("propertyType""String"); 
  15.         column1.put("propertyName""name"); 
  16.         column1.put("comment""姓名"); 
  17.         columns.add(column1); 
  18.         //年齡字段 
  19.         Map<String, Object> column2 = new HashMap<>(); 
  20.         column2.put("propertyType""Integer"); 
  21.         column2.put("propertyName""age"); 
  22.         column2.put("comment""年齡"); 
  23.         columns.add(column2); 
  24.  
  25.         //定義類的屬性 
  26.         objectMap.put("columns", columns); 
  27.         //定義作者 
  28.         objectMap.put("author""張三"); 
  29.         //定義創(chuàng)建時(shí)間 
  30.         objectMap.put("date", new SimpleDateFormat("yyyy-MM-dd").format(new Date())); 
  31.         //定義類描述 
  32.         objectMap.put("tableComment""學(xué)生信息"); 
  33.  
  34.         //生產(chǎn)目標(biāo)代碼 
  35.         Configuration configuration = new Configuration(Configuration.VERSION_2_3_23); 
  36.         configuration.setDefaultEncoding(Charset.forName("UTF-8").name()); 
  37.         configuration.setClassForTemplateLoading(CodeGeneratorDemo.class, "/"); 
  38.         Template template = configuration.getTemplate("/templates/entity.java.ftl"); 
  39.         FileOutputStream fileOutputStream = new FileOutputStream(new File("../src/main/java/com/example/generator/Student.java")); 
  40.         template.process(objectMap, new OutputStreamWriter(fileOutputStream, Charset.forName("UTF-8").name())); 
  41.         fileOutputStream.close(); 
  42.         System.out.println("文件創(chuàng)建成功"); 
  43.  
  44.     } 

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

  1. package com.example.test; 
  2.  
  3. import java.io.Serializable
  4.  
  5. /** 
  6.  * <p> 
  7.  * 學(xué)生信息 
  8.  * </p> 
  9.  * 
  10.  * @author 張三 
  11.  * @since 2021-08-22 
  12.  */ 
  13. public class Student implements Serializable { 
  14.  
  15.  private static final long serialVersionUID = 1L; 
  16.   
  17.  
  18.  /** 
  19.   * 姓名 
  20.   */ 
  21.  private String name
  22.  
  23.  /** 
  24.   * 年齡 
  25.   */ 
  26.  private Integer age; 
  27.  
  28.  public String getName() { 
  29.   return this.name
  30.  } 
  31.  
  32.  public Student setName(String name) { 
  33.   this.name = name
  34.   return this; 
  35.  } 
  36.  public Integer getAge() { 
  37.   return this.age; 
  38.  } 
  39.  
  40.  public Student setAge(Integer age) { 
  41.   this.age = age; 
  42.   return this; 
  43.  } 

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

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

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

然后通過連接數(shù)據(jù)庫(kù)的方式,把需要自動(dòng)生成的表結(jié)構(gòu)查詢出來,封裝成數(shù)據(jù)渲染參數(shù),最后傳入到freemarker中去,非常簡(jiǎn)單、快速的生成與自己預(yù)期想要的代碼,所有單表的crud全部一步到位!

下面這個(gè)就是小編,基于當(dāng)前項(xiàng)目定制開發(fā)的一款代碼生成器,項(xiàng)目采用SpringBoot + Dubbo框架開發(fā),沒有Controller層,截圖中所有的代碼全部都是采用代碼生成器生成的,直接通過單元測(cè)試就可以運(yùn)行,開發(fā)的時(shí)候非???

由于開發(fā)的代碼生成器工具,代碼有點(diǎn)過多,因此不便于通過文章分享給大家,有需要的朋友,可以訪問如下鏈接獲?。篽ttps://github.com/justdojava/springboot-example-generator

三、小結(jié)

代碼生成器,對(duì)于擅長(zhǎng)以業(yè)務(wù)開發(fā)為主的程序員來說,絕對(duì)是一個(gè)巨大的福利,它能很明顯的減輕開發(fā)人員的工作量,并且提升開發(fā)效率,能騰出更多的時(shí)間專注業(yè)務(wù)開發(fā)。

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

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

四、參考

1、MyBatis-Plus 文檔

 

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2023-03-14 07:34:47

代碼生成器開發(fā)

2024-01-07 20:00:27

2021-01-21 06:04:55

Go語言TCP目錄生成器

2021-09-26 16:08:23

CC++clang_forma

2021-02-26 11:54:38

MyBatis 插件接口

2021-11-24 16:02:57

鴻蒙HarmonyOS應(yīng)用

2024-04-02 08:58:13

2024-03-05 18:27:43

2021-07-14 09:00:00

JavaFX開發(fā)應(yīng)用

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機(jī)

2024-01-26 08:16:48

Exporter開源cprobe

2023-03-01 09:22:53

雙通道內(nèi)存內(nèi)存條

2024-03-18 18:07:38

VSCode插件文件

2021-09-15 07:33:33

Java開發(fā)在線

2022-01-08 20:04:20

攔截系統(tǒng)調(diào)用

2023-04-26 12:46:43

DockerSpringKubernetes

2022-12-07 08:42:35

2022-07-27 08:16:22

搜索引擎Lucene

2022-03-14 14:47:21

HarmonyOS操作系統(tǒng)鴻蒙
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)