日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
JavaWeb模板代碼生成器的設(shè)計(jì)與實(shí)現(xiàn)

起因

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

創(chuàng)新互聯(lián)建站專注于武陟企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,成都做商城網(wǎng)站。武陟網(wǎng)站建設(shè)公司,為武陟等地區(qū)提供建站服務(wù)。全流程按需定制,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)

目標(biāo)

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

代碼框架

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

設(shè)計(jì)思路

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

邏輯步驟

  1. 解析命令行
  2. 解析配置文件
  3. 獲取數(shù)據(jù)表信息
  4. 生成配置信息
  5. 生成文件

代碼設(shè)計(jì)

命令解析類 ShellRunner

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

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

配置文件的配置項(xiàng)有:

//Java SQL 驅(qū)動(dòng)所在路徑(暫未使用)
private static final String CLASS_PATH_ENTRY = "class.path.entry";
//Java 驅(qū)動(dòng)類型(暫未使用)
private static final String DRIVER_CLASS = "driver.class";
//數(shù)據(jù)庫(kù)地址
private static final String CONNECTION_URL = "connection.url";
//數(shù)據(jù)庫(kù)用戶名
private static final String USER_ID = "user.id";
//數(shù)據(jù)庫(kù)密碼
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";
//項(xiàng)目地址
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

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

Class.forName(configuration.getDriverClass());
//獲取數(shù)據(jù)庫(kù)連接
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)獲得目標(biāo)數(shù)據(jù)表的表信息。

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

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

字段 描述
DATA_TYPE數(shù)據(jù)類型
COLUMN_SIZE數(shù)據(jù)長(zhǎng)度
COLUMN_NANE列名
NULLABLE是否允許非空
DECIMAL_DIGITS小數(shù)位數(shù)
REMARKS備注
COLUMN_DEF默認(rèn)值

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

文件生成類 FileGenerator

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

主邏輯如下:

/** * @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("");
    //測(cè)試環(huán)境獲取項(xiàng)目根目錄路徑
    //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")); //需要文件夾絕對(duì)路徑
    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());
}

注意

在測(cè)試中,Class.class.getClass().getResource("/").getPath();該方法可以獲取項(xiàng)目根目錄,但是在測(cè)試生成的Jar包時(shí),該方法時(shí)效。因此在生成Jar包前需要把該行修改成new File("").getAbsolutePath();獲取生成路徑。

項(xiàng)目結(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

運(yùn)行命令范例

java -jar JavaWebCodeGenerator.jar -configfile generatorConfig.properties -overwrite

實(shí)例演示

源代碼

https://github.com/TedHacker/PracticeArea/tree/master/JavaWebCodeGenerator


分享標(biāo)題:JavaWeb模板代碼生成器的設(shè)計(jì)與實(shí)現(xiàn)
本文網(wǎng)址:http://www.5511xx.com/article/djgeppi.html