Java代碼生成器:Codgen

jopen 11年前發布 | 46K 次閱讀 Codgen Java開發

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或以上兼容版本
除了以上4個必須依賴的開源包以外,由于codgen的TableModel元數據是通過JDBC來獲取的,還需要下載對應數據庫方言的JDBC驅動包,比如SQLServer2005的JDBC驅動包是sqljdbc.jar。目前codgen默認只支持Oracle10g\SQLServer2000 \SQLServer2005三種數據庫版本。但是可以通過擴展實現codgen提供的DbProvider接口來支持更多的數據庫版本。
  • 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());
                }
        }

項目主頁:http://www.baiduhome.net/lib/view/home/1359700183129

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!