Java代碼生成器:Codgen
1、什么是codgen?
Codgen是一個基于數據庫元數據模型,使用freemarker模板引擎來構建輸出的代碼生成器。freemarker的數據模型結構通常來說都是一個Map樹狀結構模型,codgen也不例外,它的數據模型這棵樹的根節點一般包含一個TableModel(表數據模型)對象。TableModel顧名思義就是由一張數據庫表的元數據信息組成的一個數據模型,有了這個數據模型,再加上一套使用freemarker編寫的多層架構模板,就可以生成一套基于這個表的多層架構代碼文件。
1.1 codgen的數據模型
雖然說codgen通常需要包含一個TableModel來生成基于某張數據庫表的一系列代碼文件,但是可以動態去修改這些數據模型的內容,包括增加、替換和移除這棵數據模型樹的任一個節點。簡而言之,只要保證被解析的模板引用到的那些數據模型存在即可。
1.2 codgen的模板
codgen的模板支持兩種格式,一種是text(文本格式);另一種是file(文件格式)。
1.3 codgen的輸出
Codgen的輸出和模板一樣,也支持兩種輸出格式,一種是text(文本格式);另一種是file(文件格式)。
2、如何使用codgen
2.1 下載最新的codgen.jar及其依賴包
由于codgen不是一個獨立的項目,本著不重新發明輪子的原則,依賴于一些比較流行的開源框架。因此除了需要下載最新的codgen.jar包文件以外,還要下載以下jar文件:
- commons-lang.jar 或以上兼容版本
- commons-logging.jar或以上兼容版本
- log4j-1.2.14或以上兼容版本
- freemarker-2.3.13或以上兼容版本
- Oracle10g的JDBC驅動包:ojdbc14.jar
- SQLServer2000的JDBC驅動包:msbase.jar、mssqlserver.jar和msutil.jar
- SQLServer2005的JDBC驅動包:sqljdbc.jar
2.2 編寫codgen配置文件
雖然不使用配置文件的方式也可以實現整個代碼的構建操作,但是為了減少使用代碼的編寫量及方便日后維護,建議使用配置文件來聲明構建所依賴的一些信息,譬如 ‘數據模型’變量聲明,‘輸出模型’變量聲明,以及數據庫信息提供者等一些可以與代碼分離的配置信息。以下就是一段比較完整的配置文件:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE codgen-config PUBLIC "-//Apache Software Foundation//DTD Tengen Configuration 1.0//EN" "com/bcs/codgen/resources/codgen-config_1_0.dtd"> <codgen-config> <project name="AOWork" label="工程驗收" outputEncoding="GBK" isDefault="true" extends="defaultProject"> <dbProvider class="com.bcs.codgen.service.impl.Sql2005Provider"> <jdbcConfig> <driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver> <url>jdbc:sqlserver://127.0.0.1\SQL2005;DatabaseName=MUCM_DG;selectMethod=cursor</url> <user>sa</user> <password>sa</password> </jdbcConfig> <columnHandler class="com.bcs.codgen.service.impl.DataTypeConverterForJava"/> </dbProvider> <dataModel name="templateDirectory">template/AOWork</dataModel> <dataModel name="outputDirectory">D:/QtoneProject/TengenCode/${copyright.author}/${projectName}</dataModel> <dataModel name="NamespaceModel" >com.qtone.aow.model.${groupName}</dataModel> <dataModel name="NamespaceParam">com.qtone.aow.model.${groupName}</dataModel> <dataModel name="NamespaceDao">com.qtone.aow.dao.${groupName}</dataModel> <dataModel name="NamespaceDaoImpl">com.qtone.aow.dao.${groupName}</dataModel> <dataModel name="NamespaceBll">com.qtone.aow.bll.${groupName}</dataModel> <dataModel name="NamespaceBllImpl">com.qtone.aow.bll.${groupName}</dataModel> <dataModel name="NamespaceApp">com.qtone.aow.app.${groupName}</dataModel> <template name="tDao" type="file">dao.ftl</template> <output name="Model" type="text" templateText="${defaultJavaModel}" ></output> <output name="Param" type="text" templateFile="Param.ftl" ></output> <output name="Dao" type="text" templateName="tDao"></output> <output name="DaoImpl" type="text"></output> <output name="Bll" type="file" templateFile="template/AOWork/Bll">${outputDirectory}/Bll.java</output> <output name="BllImpl" type="file">${outputDirectory}/BllImpl.java</output> </project> </codgen-config>
2.3 編寫客戶端調用代碼
2.3.1 Web環境下使用示例(以struts為例) private ActionForward generate(ActionMapping mapping, GenerateForm generateForm,
HttpServletRequest request, HttpServletResponse response) {
BuildModel buildModel = generateForm.getBuildModel();
//取得指定項目名稱的配置信息
ProjectConfig projectConfig = ProjectConfigHelper
.getProjectConfig(this.getServlet().getServletContext()
, buildModel.getProjectName());
//實例化一個項目構建配置對象
ProjectBuildConfig buildConfig = new ProjectBuildConfig(projectConfig);
//設置數據庫表名稱(Sys_UserInfo)
buildConfig.setTableName(buildModel.getTableName());
//設置表標簽(如:用戶信息)
buildConfig.setTableLabel(buildModel.getTableLabel());
//設置分組名稱(通常為表 名稱的前綴,如:Sys)
buildConfig.setGroupName(buildModel.getGroupName());
//設置模塊名稱(如:UserInfo)
buildConfig.setModuleName(buildModel.getModuleName());
//設置版本的創建人
buildConfig.getCopyright().setAuthor(buildModel.getAuthor());
//由一個構建配置對象實例化一個代碼生成器對象
Builder builder = new CodeBuilder(buildConfig);
builder.build(); //執行構建操作
return mapping.findForward(INPUT_FORWARD);
}
在 web環境下,codgen是這樣去尋找配置文件來加載的:如果web.xml配置了名稱為“codgen.config”的上下文初始化參數(相對于 WEB-INF目錄下的文件路徑,多個文件名以英文逗號分隔);如果未配置該參數,則默認讀取類路徑根目錄下的"codgen-config.xml",所以在這種情況下請確保src目錄下存在codgen-config.xml文件。
2.3.2 非web環境下使用示例 public static void main(String[] args) {
//取得默認的項目配置信息,在非web環境下調用傳遞參數null即可,但配置文件必須是src目錄下的codgen-config.xml
ProjectConfig projectConfig = ProjectConfigHelper.getDefaultProjectConfig(null);
ProjectBuildConfig buildConfig = new ProjectBuildConfig(projectConfig);
buildConfig.setTableName("Sys_UserInfo");
//buildConfig.setTableLabel("用戶信息"); //不設置默認為表注釋,表注釋為空時則使用表名稱
//buildConfig.setGroupName("System"); //不設置默認為Sys
//buildConfig.setModuleName("UserInfo"); //不設置默認為UserInfo
//buildConfig.getCopyright().setAuthor("黃天政"); //不設置默認為當前計算機用戶名
Builder builder = new CodeBuilder(buildConfig);
Map<String,OutputModel> omMap = builder.build();
for(Entry<String,OutputModel> entry : omMap.entrySet()){
System.out.println("生成內容="+entry.getValue().getOutput());
}
}
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!