成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

手把手教你開發一套代碼生成器,學不會的來懟我!

開發 開發工具
代碼生成器,對于擅長以業務開發為主的程序員來說,絕對是一個巨大的福利,它能很明顯的減輕開發人員的工作量,并且提升開發效率,能騰出更多的時間專注業務開發。

?一、介紹

在實際的軟件項目開發過程中,我可以很負責任的跟大家說,如果你真的實際寫代碼的時間超過5年,你對增刪改查這類簡單的功能需求開發,可以說已經完全寫吐了,至少我就是這種類型的。

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

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

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

假如某個新開發的功能,要新增10張表,按照這個時間計算,至少要100分鐘,仔細想想,其實你會發現大部分的時間都浪費在這些簡單而又重復的編程圈子中去了。

那有沒有一個辦法,將這些簡單的CURD代碼,全部都標準化、公共化呢?這樣我們的可以省下很多時間來投入業務場景的開發。

答案是肯定的,有!

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

還有我們所熟悉的JPA?,里面有一套公共的持久層動態代理類,它可以自動根據名稱生成SQL語句,能為開發省下不少的事情。

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

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

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

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

當然,還有一個明顯的疑慮,就是對微服務的開發,不能全面支持,比如你項目采用的是SpringBoot +Dubbo?組合來開發,這個時候生成的controller,完全沒啥用處,而且還很雞肋。

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

下面我就簡單的介紹一下,如何自行開發一套代碼生成器,過程如下!

二、代碼實踐

其實開發一套代碼生成器,真沒大家想象中的那么復雜,其中用的最重要一項技術,就是利用模板來生成代碼,例如我們經常使用的模板引擎freemarker,它就可以幫助我們實現這一點。

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

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

2.2、然后創建一個代碼模版

下面我們以動態創建實體類為例,編寫一個實體類的模板entity.java.ftl?,其中${}里面定義的是動態變量。

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、最后生成目標代碼

最后我們基于freemarker編寫一個測試類!

public class CodeGeneratorDemo {

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

//定義實體類屬性
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);

//定義類的屬性
objectMap.put("columns", columns);
//定義作者
objectMap.put("author", "張三");
//定義創建時間
objectMap.put("date", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
//定義類描述
objectMap.put("tableComment", "學生信息");

//生產目標代碼
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("文件創建成功");

}
}

運行程序,輸出的文件結果如下!

package com.example.test;

import java.io.Serializable;

/**
* <p>
* 學生信息
* </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;
}
}

與預期的效果一致,成功生成!

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

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

圖片

然后通過連接數據庫的方式,把需要自動生成的表結構查詢出來,封裝成數據渲染參數,最后傳入到freemarker?中去,非常簡單、快速的生成與自己預期想要的代碼,所有單表的crud全部一步到位!

下面這個就是小編,基于當前項目定制開發的一款代碼生成器,項目采用SpringBoot + Dubbo?框架開發,沒有Controller層,截圖中所有的代碼全部都是采用代碼生成器生成的,直接通過單元測試就可以運行,開發的時候非常快!

圖片

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

三、小結

代碼生成器,對于擅長以業務開發為主的程序員來說,絕對是一個巨大的福利,它能很明顯的減輕開發人員的工作量,并且提升開發效率,能騰出更多的時間專注業務開發。

實際上,目前網上已經有很多的成熟、穩定的代碼生成器,mybatis-plus?就是其中一個使用非常廣泛的代碼生成器,對于以單體web開發為主的項目,它完全滿足要求。

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

四、參考

1、MyBatis-Plus 文檔

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2021-08-23 07:32:57

生成器開發代碼

2024-01-07 20:00:27

2021-01-21 06:04:55

Go語言TCP目錄生成器

2022-08-25 14:41:51

集群搭建

2024-10-21 08:01:49

私服倉庫Maven

2022-07-14 07:34:26

windowsmysqlcentos

2021-09-26 16:08:23

CC++clang_forma

2021-02-26 11:54:38

MyBatis 插件接口

2018-03-05 11:10:12

2021-11-24 16:02:57

鴻蒙HarmonyOS應用

2024-03-05 18:27:43

2024-04-02 08:58:13

2021-07-14 09:00:00

JavaFX開發應用

2011-01-10 14:41:26

2025-05-07 00:31:30

2011-05-03 15:59:00

黑盒打印機

2024-01-26 08:16:48

Exporter開源cprobe

2024-03-18 18:07:38

VSCode插件文件

2023-03-01 09:22:53

雙通道內存內存條

2022-07-27 08:16:22

搜索引擎Lucene
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩在线第一 | 国产精品久久久久久久岛一牛影视 | 亚洲精品一区二区二区 | av网站免费观看 | 九九久视频 | 国产香蕉视频在线播放 | 色综合中文 | 国产精品久久九九 | 特黄色一级毛片 | 日韩成人免费av | 日韩久久精品电影 | 国产精品久久国产精品 | 亚洲综合视频 | 91综合网 | 国产成人免费视频 | 精品欧美激情在线观看 | 久久天天躁狠狠躁夜夜躁2014 | 精品国产一区二区三区久久狼黑人 | 久草精品视频 | 国产精品久久久久久网站 | 日韩在线综合网 | 成人1区 | 久久国产成人 | 欧美日韩不卡 | 免费国产一区二区视频 | 日韩字幕| 一区二区三区av | 91网站在线播放 | 国产乱码精品一区二区三区中文 | 日韩视频在线播放 | 欧美在线观看免费观看视频 | 久久久久久久国产 | 午夜影院免费体验区 | 一区二区三区四区在线免费观看 | 国产日韩欧美在线一区 | 91久久夜色精品国产网站 | 91中文字幕在线观看 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | www.精品一区 | 黄色大片免费网站 | 久久亚洲精品久久国产一区二区 |