目錄
起因
目標
程式碼框架
設計想法
首頁 Java java教程 詳解Java Web模板程式碼產生器的設計與實現

詳解Java Web模板程式碼產生器的設計與實現

Mar 18, 2017 am 10:32 AM

起因

專案中需要根據資料庫表寫很多Meta、Dao、Service程式碼,其中許多程式碼都是重複而繁瑣的。因此如果有一個模板程式碼的生成器,就可以一定程度提高開發效率。

目標

可設定產生Java Web專案中Dao、Meta、Service層範本程式碼的生成器。

程式碼框架

mvn archetype:generate 
-DgroupId=com.zju 
-DartifactId=JavaWebCodeGenerator 
-DarchetypeArtifactId=maven-archetype-webapp 
-DinteractiveMode=false 
-DarchetypeCatalog=internal
登入後複製

設計想法

專案參考Mybatis generator產生程式碼的過程,具體步驟分為以下5步驟。

邏輯步驟

  1. 解析命令列

  2. #解析設定檔

  3. 取得資料表資訊

  4. 產生設定資訊

  5. ##產生檔案

#程式碼設計

命令解析類別ShellRunner

#該類別負責解析命令列的命令,解析設定檔並封裝所需的資料給程式碼生成類別。

可解析指令有

-configfile<a href="http://www.php.cn/wiki/1313.html" target="_blank"></a>:指定設定檔所在路徑與-overwrite:是否重寫目標檔。

設定檔的配置項目有:

//Java SQL 驱动所在路径(暂未使用)
private static final String CLASS_PATH_ENTRY = "class.path.entry";
//Java 驱动类型(暂未使用)
private static final String DRIVER_CLASS = "driver.class";
//数据库地址
private static final String CONNECTION_URL = "connection.url";
//数据库用户名
private static final String USER_ID = "user.id";
//数据库密码
private static final String USER_PASSWORD = "user.password";
//模型生成地址
private static final String JAVA_MODEL_PACKAGE = "java.model.package";
//SQL生成地址
private static final String SQL_MAPPING_PACKAGE = "sql.mapping.package";
//项目地址
private static final String PROJECT = "project";
//数据表名
private static final String TABLE_NAME = "table.name";
//模型名称
private static final String DOMAIN_OBJECT_NAME = "domain.object.name";
登入後複製

程式碼產生類別CodeGenerator

該類別負責連接資料庫,查詢資料表的表格信息,將SQL類型對應成Java類型並封裝所需的資料給檔案產生類別。

Class.forName(configuration.getDriverClass());
//获取数据库连接
Connection connection = DriverManager.getConnection(configuration.getConnectionURL(), 
configuration.getUserId(), 
configuration.getPassword());
DatabaseMetaData databaseMetaData = connection.getMetaData();
//获取表结构信息
ResultSet rs = databaseMetaData.getColumns("", "", configuration.getTableName(), "%");
登入後複製

透過以上幾行程式碼,rs變數中已經取得目標資料表的表格資訊。

databaseMetaData.getColumns方法的實質是執行了SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME="tableName"語句。

在結果集中,後續處理大致需要以下表格資訊列。

欄位描述#DATA_TYPECOLUMN_SIZE#COLUMN_NANE 欄位名稱NULLABLE是否允許非空#DECIMAL_DIGITS小數位數#REMARKS備註COLUMN_DEF預設值
資料型別
。最後透過

JavaTypeResolver中的類型映射(Map typeMap)和StringUtils中的駝峰命名轉換(getCamelCaseString)將SQL資訊轉換成Java資訊。

檔案產生類別 FileGenerator

該類別透過

FreeMarker範本引擎組合資料成目標程式碼檔案。

主邏輯如下:

/**
* @param configuration 封装的配置信息
* @param columns       封装的数据表列信息
* @throws IOException
* @throws TemplateException
*/
public static void writeFile(Configuration configuration, List<TableColumn> columns) throws IOException, 
TemplateException {
    File r=new File("");
    //测试环境获取项目根目录路径
    //String path=Class.class.getClass().getResource("/").getPath();
    //Jar包获取根目录路径
    String path=r.getAbsolutePath();
    //System.out.println("path:"+path);
    Configuration cfg = new Configuration();
    cfg.setDirectoryForTemplateLoading(new File(path + "/ftl")); //需要文件夹绝对路径
    cfg.setDefaultEncoding("UTF-8");
    cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
    Map root = new HashMap();
    root.put("configuration", configuration);
    root.put("columnList", columns);
    writeSingleFile(cfg, root, "DaoImpl.ftl", 
    configuration.getProjectPath(), 
    configuration.getSqlMappingPackage().replace(".", "/"), 
    configuration.getDomainObjectName(), "DaoImpl.java",configuration.getOverwrite());
    writeSingleFile(cfg, root, "Dao.ftl", 
    configuration.getProjectPath(), 
    configuration.getSqlMappingPackage().replace(".", "/"), 
    configuration.getDomainObjectName(), "Dao.java",configuration.getOverwrite());
    writeSingleFile(cfg, root, "Meta.ftl", 
    configuration.getProjectPath(), 
    configuration.getJavaModelPackage().replace(".", "/"), 
    configuration.getDomainObjectName(), ".java",configuration.getOverwrite());
}
登入後複製

注意

#在測試中,

Class.class.getClass().getResource("/" ).getPath();此方法可以取得專案根目錄,但是在測試產生的Jar套件時,此方法時效。因此在產生Jar套件前需要把該行修改成new File("").getAbsolutePath();取得生成路徑。

專案結構

詳解Java Web模板程式碼產生器的設計與實現

設定檔範例

generatorConfig.properties

class.path.entry=src/test/resources/mysql-connector-java-5.1.38.jar
driver.class=com.mysql.jdbc.Driver
connection.url=jdbc:mysql://localhost:3307/work
user.id=
user.password=
java.model.package=com.model
sql.mapping.package=com.dao
project=src
table.name=holiday
domain.object.name=Holiday
登入後複製

執行指令範例

java -jar JavaWebCodeGenerator.jar -configfile generatorConfig.properties -overwrite
登入後複製

實例示範

詳解Java Web模板程式碼產生器的設計與實現#

以上是詳解Java Web模板程式碼產生器的設計與實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

AI證件照產生器:實際測試中AI軟體展現了絕無僅有的強大效能 AI證件照產生器:實際測試中AI軟體展現了絕無僅有的強大效能 Aug 09, 2023 pm 07:33 PM

經過實際測試,AI證件照產生器表現出色,其強大的功能令人驚嘆,確實不需要再費心去拍照了!本句話的重寫如下:使用觸站AI軟體(版權和解釋權歸觸站AI所有,僅用於展示生成效果)素描模式:無論是在日常工作還是商務辦公場合,職業形像都至關重要。而一張精美的證件照能夠提升個人的專業形象。透過AI產生的證件照不僅符合傳統照片標準,也能夠還原個人獨特的臉部特徵。 AI技術能夠智慧辨識臉部輪廓、膚色、光線等各種細節,產生最適合的證件照。不論是顏值還是氣質,都能夠完美展現,給人留下深刻的第一印象AI一鍵生成證件照的

如何使用Java來寫一個簡單的學生成績報表產生器? 如何使用Java來寫一個簡單的學生成績報表產生器? Nov 03, 2023 pm 02:57 PM

如何使用Java來寫一個簡單的學生成績報表產生器?學生成績報表產生器是可以幫助老師或教育者快速產生學生成績報告的工具。本文將介紹如何使用Java來撰寫簡單的學生成績報表產生器。首先,我們要定義學生對象和學生成績對象。學生對象包含學生的姓名、學號等基本訊息,而學生成績對象則包含學生的科目成績和平均成績等資訊。以下是一個簡單的學生物件的定義:public

最佳免費AI動畫藝術生成器 最佳免費AI動畫藝術生成器 Feb 19, 2024 pm 10:50 PM

如果您渴望找到頂尖的免費AI動畫藝術生成器,您可以結束搜尋了。動漫藝術世界幾十年來一直以其獨特的角色設計、迷人的色彩和引人入勝的情節吸引觀眾。不過,創作動漫藝術需要天份、技能和耗費大量時間。然而,隨著人工智慧(AI)的不斷發展,現在你可以藉助最佳的免費AI動畫藝術生成器,無需深入了解複雜技術,就能探索動漫藝術的世界。這將為你釋放創造力提供新的可能性。什麼是人工智慧動漫藝術生成器? AI動畫藝術生成器利用複雜的演算法和機器學習技術,分析廣泛的動畫作品資料庫。透過這些演算法,系統學習並識別不同動漫風格的

如何透過PHP編寫一個簡單的二維碼產生器 如何透過PHP編寫一個簡單的二維碼產生器 Sep 24, 2023 am 08:49 AM

如何透過PHP編寫一個簡單的二維碼產生器二維碼在現代社會中已經變得非常常見,它能夠快速傳遞訊息,提升使用者體驗。在本文中,我將向大家介紹如何使用PHP來寫一個簡單的二維碼產生器。一、安裝必要的工具和函式庫在開始之前,我們需要確保已經安裝以下工具和函式庫:PHP:確保已經安裝了PHP的最新版本,可以透過執行php-v指令來查看目前PHP的版本。 Composer:C

PHP7中的生成器:如何有效率地處理大規模資料和節省記憶體? PHP7中的生成器:如何有效率地處理大規模資料和節省記憶體? Oct 20, 2023 pm 04:42 PM

PHP7中的生成器:如何有效率地處理大規模資料和節省記憶體?概述:在大規模資料處理和節省記憶體方面,PHP7引入了生成器(Generators)作為一種強大的工具。生成器是PHP語言中一類特殊的函數,與普通函數不同的是,生成器可以暫停執行並傳回中間結果,而不是將所有結果一次傳回。這使得生成器非常適合處理大批量數據,降低了記憶體的使用和提高了處理效率。本文將介紹生

PHP7中的生成器:如何有效率地處理大量資料和延遲載入? PHP7中的生成器:如何有效率地處理大量資料和延遲載入? Oct 27, 2023 pm 07:31 PM

PHP7中引入了生成器(Generator)這個概念,它提供了一種有效率地處理大量資料和延遲載入的方法。本文將從概念和原理入手,結合具體程式碼範例,介紹PHP7中生成器的使用方法和優勢。生成器是一種特殊的函數,它不是一次性地將所有資料傳回,而是按需產生資料。當函數執行到yield語句時,會將目前產生的值傳回,並且函數的狀態會被儲存。下次呼叫生成器函數時,函數會

用ChatGPT秒建造大模型! OpenAI全新插件殺瘋了,接取程式碼解釋器一鍵get 用ChatGPT秒建造大模型! OpenAI全新插件殺瘋了,接取程式碼解釋器一鍵get Apr 04, 2023 am 11:30 AM

ChatGPT可以連網後,OpenAI還火速介紹了一款程式碼產生器,在這個插件的加持下,ChatGPT甚至可以自己生成機器學習模型了。上週五,OpenAI剛剛宣布了令人驚爆的消息,ChatGPT可以連網,接入第三方插件了!而除了第三方插件,OpenAI也介紹了一款自家的插件「程式碼解釋器」,並給出了幾個特別的用例:解決定量和定性的數學問題;進行資料分析和視覺化;快速轉換檔案格式。此外,Greg Brockman演示了ChatGPT還可以處理上傳視訊檔案。而一位叫Andrew Mayne的暢銷作

Python中的迭代器和生成器的差別是什麼? Python中的迭代器和生成器的差別是什麼? Oct 20, 2023 pm 07:10 PM

Python中的迭代器和生成器的差別是什麼?在Python程式設計中,迭代器(iterator)和生成器(generator)都是用來處理可迭代物件的工具。它們兩者都可以用於遍歷數據,但是在實現上卻有一些不同之處。迭代器是一個對象,它實作了迭代器協定(iteratorprotocol)。迭代器物件需要包含兩個方法:__iter__()和__next__()。其

See all articles