日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 模板实现原理,Java Web 模板代码生成器的设计与实现详解

發(fā)布時間:2024/4/18 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 模板实现原理,Java Web 模板代码生成器的设计与实现详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

起因

項目中需要根據(jù)數(shù)據(jù)庫表寫很多Meta、Dao、Service代碼,其中很多代碼都是重復(fù)而繁瑣的。因此如果有一個模板代碼的生成器,就可以一定程度提高開發(fā)效率。

目標

可配置生成Java Web項目中Dao、Meta、Service層模板代碼的生成器。

代碼框架

mvn archetype:generate -DgroupId=com.zju -DartifactId=JavaWebCodeGenerator -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false -DarchetypeCatalog=internal

設(shè)計思路

項目參考Mybatis generator生成代碼的過程,具體步驟分為以下5步。

邏輯步驟

解析命令行

解析配置文件

獲取數(shù)據(jù)表信息

生成配置信息

生成文件

代碼設(shè)計

命令解析類 ShellRunner

該類負責解析命令行的命令,解析配置文件并封裝所需的數(shù)據(jù)給代碼生成類。

可解析命令有-configfile:指定配置文件所在路徑和-overwrite:是否重寫目標文件。

配置文件的配置項有:

//Java SQL 驅(qū)動所在路徑(暫未使用)

private static final String CLASS_PATH_ENTRY = "class.path.entry";

//Java 驅(qū)動類型(暫未使用)

private static final String DRIVER_CLASS = "driver.class";

//數(shù)據(jù)庫地址

private static final String CONNECTION_URL = "connection.url";

//數(shù)據(jù)庫用戶名

private static final String USER_ID = "user.id";

//數(shù)據(jù)庫密碼

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";

//數(shù)據(jù)表名

private static final String TABLE_NAME = "table.name";

//模型名稱

private static final String DOMAIN_OBJECT_NAME = "domain.object.name";

代碼生成類 CodeGenerator

該類負責連接數(shù)據(jù)庫,查詢數(shù)據(jù)表的表信息,將SQL類型映射成Java類型并封裝所需的數(shù)據(jù)給文件生成類。

Class.forName(configuration.getDriverClass());

//獲取數(shù)據(jù)庫連接

Connection connection = DriverManager.getConnection(configuration.getConnectionURL(), configuration.getUserId(), configuration.getPassword());

DatabaseMetaData databaseMetaData = connection.getMetaData();

//獲取表結(jié)構(gòu)信息

ResultSet rs = databaseMetaData.getColumns("", "", configuration.getTableName(), "%");

通過以上幾行代碼,rs變量中已經(jīng)獲得目標數(shù)據(jù)表的表信息。

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

在結(jié)果集中,后續(xù)處理大致需要以下表信息列。

字段

描述

DATA_TYPE

數(shù)據(jù)類型

COLUMN_SIZE

數(shù)據(jù)長度

COLUMN_NANE

列名

NULLABLE

是否允許非空

DECIMAL_DIGITS

小數(shù)位數(shù)

REMARKS

備注

COLUMN_DEF

默認值

最后通過JavaTypeResolver中的類型映射(Map typeMap)和StringUtils中的駝峰命名轉(zhuǎn)換(getCamelCaseString)將SQL信息轉(zhuǎn)換成Java信息。

文件生成類 FileGenerator

該類通過FreeMarker模板引擎組合數(shù)據(jù)成目標代碼文件。

主邏輯如下:

/**

* @param configuration 封裝的配置信息

* @param columns 封裝的數(shù)據(jù)表列信息

* @throws IOException

* @throws TemplateException

*/

public static void writeFile(Configuration configuration, List columns) throws IOException, TemplateException {

File r=new File("");

//測試環(huán)境獲取項目根目錄路徑

//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();獲取生成路徑。

項目結(jié)構(gòu)

配置文件范例

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

實例演示

源代碼

總結(jié)

以上是生活随笔為你收集整理的java 模板实现原理,Java Web 模板代码生成器的设计与实现详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。