首頁 >Java >java教程 >詳解Java Web模板程式碼產生器的設計與實現

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

黄舟
黄舟原創
2017-03-18 10:32:232362瀏覽

起因

專案中需要根據資料庫表寫很多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