Tao

          Tao obeys its own inherent Nature

          基于JavaScript的代碼自動(dòng)生成工具

          JavaScript Based Code Generator - codegen

          工具主頁(yè)

          http://thelei.sourceforge.net

          目的

          快速生成程序代碼, 比如Struts, Spring, Jdbc/Hibernate所有前后臺(tái)的代碼.

          簡(jiǎn)單介紹

          本工具生成代碼的思想是讀取數(shù)據(jù)庫(kù)中表的結(jié)構(gòu), 使用JavaScript作為腳本語(yǔ)言編寫模板, 生成各種代碼或者文件, 支持各種格式的文本文件, Java, C#, PHP 等, 只要是文本文件, 都可以生成, 因?yàn)樯墒裁词怯赡阃耆约憾x的. 對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)是通過(guò)插件的形式進(jìn)行的, 所以易于擴(kuò)充, 目前支持Mysql, 以及支持Ado連接的數(shù)據(jù)庫(kù). 

          本工具開發(fā)于2006年, 經(jīng)過(guò)兩年的內(nèi)部使用, 進(jìn)行了不斷改進(jìn), 現(xiàn)在把它公布出來(lái), 希望能有更多的人用它, 提意見, 然后把它做的更好.

          什么時(shí)候用它

          有時(shí)候在項(xiàng)目開發(fā)過(guò)程中有大量的簡(jiǎn)單重復(fù)勞動(dòng), 以Struts, Spring, Jdbc/Hibernate為例, 對(duì)數(shù)據(jù)庫(kù)中的每張表, 都有其相對(duì)應(yīng)的Dao(2), Service(2), Action(Class+Validation2), Jsp(list+edit+add=3), 需要新建10多個(gè)文件/目錄,  而這個(gè)過(guò)程是很枯燥的, 但又會(huì)花不少時(shí)間, 這個(gè)工具的最初開發(fā)目的就是自動(dòng)生成這些文件. 這樣,新增一個(gè)列表,增刪改的模塊, 如果不考慮界面需要調(diào)整, 就只需要幾分鐘的時(shí)間, 換句話說(shuō), 你可以在很短的時(shí)間內(nèi)把所有需要的表自動(dòng)生成列表,增刪改的功能.

          為什么用它

          答案很簡(jiǎn)單, 因?yàn)檫@個(gè)程序簡(jiǎn)單容易使用, 而且完全自定義, 能滿足不同項(xiàng)目對(duì)代碼的要求, 只要你能描述出要生成的代碼結(jié)構(gòu)和形式的共性,就能把模板寫出來(lái).

          簡(jiǎn)單的例子

          public class Base<%=getDomainByTable(sys_table_name)%>{

          <$

          for (var i=0; i<sys_fields.length; i++)

          {

          var type = getJavaBeanType(sys_fields[i].type);$>

          private <%=type%> <%=sys_fields[i].name%>;

          <$

          }



          for (var i=0; i<sys_fields.length; i++)

          {

          var type = getJavaBeanType(sys_fields[i].type);

          $>

          public <%=type%> get<%=formatFieldName(sys_fields[i].name)%>(){

          return <%=sys_fields[i].name%>;

          }

          public void set<%=formatFieldName(sys_fields[i].name)%> (<%=type%> <%=sys_fields[i].name%>){

          this.<%=sys_fields[i].name%> = <%=sys_fields[i].name%>;

          }

          <$

          }

          $>

          }
          如果當(dāng)前的表名是:Role, 同時(shí)它有role_id int, role_name varchar, description varchar等字段, 那么生成的結(jié)果就是:

          public class BaseRole{

          private int role_id;

          private String role_name;

          private String description;



          public int getRoleId(){

          return role_id;

          }

          public void setRoleId (int role_id){

          this.role_id = role_id;

          }

          public String getRoleName(){

          return role_name;

          }

          public void setRoleName (String role_name){

          this.role_name = role_name;

          }

          public String getDescription(){

          return description;

          }

          public void setDescription (String description){

          this.description = description;

          }

          }
          從模板里可以看到, 要生成什么樣的代碼都是自己可以定制的, 包括方法的起名, 例子里formatFieldName是自己寫的JavaScript 方法.

          腳本塊

          1. <$
                  //Javascript code like: println(sys_fields[0].name);
            $> 執(zhí)行一段代碼
          2. <$=sys_fields[0].name$> 顯示表達(dá)式的值

          預(yù)定義的變量

          1. sys_table_name: 當(dāng)前表名
          2. sys_fields: 當(dāng)前表的Field 對(duì)象數(shù)組. 使用sys_fields.length 來(lái)獲取字段的數(shù)目.
          3. sys_keys: 當(dāng)前表主鍵的數(shù)組, 使用sys_keys.length來(lái)獲取主鍵字段的數(shù)量.
          4. sys_user_name: 當(dāng)前連接數(shù)據(jù)庫(kù)的用戶名
          5. sys_db_name: 當(dāng)前連接到數(shù)據(jù)庫(kù)的名字
          6. sys_output: 內(nèi)部使用,存儲(chǔ)生成的中間JavaScript代碼
          7. Field 對(duì)象屬性, 如果有一個(gè)字段: user_name varchar(100) not null default 'user', 下面是Field的屬性和值:
                name: 字段名, String. 如: sys_fields[i].name, 例子值是 user_name
                type: 字段類型, String, 如: sys_fields[i].type, 例子值是 varchar
                size: 字段長(zhǎng)度, integer, 如: sys_fields[i].size, 例子值是 100
                scale: 精度, integer, 如: sys_fields[i].scale, 本例子是varchar 類型,本項(xiàng)為空
                default_value: 默認(rèn)值, String. 如: sys_fields[i].default_value, 例子值是 user
                is_null: 是否可以為空, boolean. 如: sys_fields[i].is_null, 例子值是 false
                is_primary_key: 是否是主鍵, boolean. 如: sys_fields[i].is_primary_key, 例子值是 false.

          預(yù)定義的方法

          1. print(str). 輸出str, 沒有換行 
          2. println(str). 輸出str, 結(jié)尾換行
          3. getFieldList(). 返回字段列表, 用',' 分割
          4. 一些其他的javascript 方法, 如capitalize, lowercase, uppercase, trim等等. 你也可以通過(guò)Tools/Edit public functions增加自己常用的方法

          使用步驟

          1. 創(chuàng)建一個(gè)新項(xiàng)目, 設(shè)定數(shù)據(jù)庫(kù)連接參數(shù)
          2. 添加目錄和模板, 模板采用JavaScript腳本語(yǔ)言, 唯一的區(qū)別是用<$ you code$> 把代碼包起來(lái), 或者用<%=expression%> 來(lái)打印一個(gè)表達(dá)式
          3. 生成文件, 分為三種方式: 生成文件, 生成項(xiàng)目中的所有文件, 批量生成(多表, 多模板)

          數(shù)據(jù)庫(kù)連接參數(shù)

          1. 選擇數(shù)據(jù)庫(kù)類型
          2. 輸入需要的信息, 如host, port, username, password and database name

          生成文件

          1. 生成當(dāng)前文件, Template/Generate current file
          2. 生成項(xiàng)目的所有文件, Project/Generate Project Files
          3. 批量生成, Project/Batch Generate, 然后選擇需要生成文件的tables和 templates(folders) 生成文件.

          Tips

          1. 使用JavaScript map, 而不是if ... else ..., 這樣代碼看著非常簡(jiǎn)潔
            <$

            var type_defaultvalue={

            'int':'0',

            'tinyint':'false',

            'varchar':'""',

            'datetime':'new Date()',

            };



            for (var i=0; i<sys_fields.length; i++)

            {

            var type = sys_fields[i].type;



            if(undef(type_defaultvalue[type])){

            println("Undefined default value for field type: '"+ type+"'");

            }



            //the following line has the same result
            //println(sys_table_name+".set"+formatFieldName(sys_fields[i].name)+"("+type_defaultvalue[type] + ");");
            $>
            <%=sys_table_name%>.set<%=formatFieldName(sys_fields[i].name)%>(<%=type_defaultvalue[type] %>);
            <$
            }
            $>
          2. 在項(xiàng)目屬性對(duì)話框中寫一些項(xiàng)目使用的JavaScript方法, 然后可以為不同的表生成不同的模塊, 如:
            function getModule(tablename){
                 if(tablename.startsWith('user')){
                     return "user/";
                }
                //code to return other module name
                //...
                return "";
            }
            然后設(shè)置目錄或模板的destination path為: <%=getModule(sys_table_name)%><%=getDomainByTable(sys_table_name)%>Action.java, 如果當(dāng)前的表是user, 目標(biāo)路徑將是: user/UserAction.java, 如果表名是 log, 目標(biāo)路徑將是: LogAction.java

          改進(jìn)這個(gè)工具:

          如果有下面的問(wèn)題, 請(qǐng)和我聯(lián)系:

          1. 需要一個(gè)新的數(shù)據(jù)庫(kù)插件或者你寫了一個(gè)新的數(shù)據(jù)庫(kù)插件
          2. 不知道如何使用這個(gè)工具
          3. 發(fā)現(xiàn)了Bug
          4. 其他任意的建議...

           

          最后希望這個(gè)工具對(duì)你能夠有所幫助, 同時(shí)減少編碼時(shí)Copy&Paste的時(shí)間

          posted on 2008-03-05 13:28 wade 閱讀(4582) 評(píng)論(18)  編輯  收藏 所屬分類: C++Java

          評(píng)論

          # re: 基于JavaScript的代碼自動(dòng)生成工具 2008-03-06 08:50 ivin

          不錯(cuò),不錯(cuò)啊,非常的實(shí)用,而且是用js寫的,也沒什么環(huán)境的要求。瀏覽器即可,以前自己也寫過(guò)這樣的工具用于處理重復(fù)的勞動(dòng)。  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具[未登錄] 2008-03-06 09:03 wade

          是C++寫的, 用戶使用Javascript來(lái)編寫模板, 需要下載, 解壓后即可運(yùn)行.  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具 2008-03-06 19:25 WLR

          很好,很強(qiáng)大,支持
          by http://www.vifir.com/?refer=blogjava_programmer  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具 2008-03-07 11:46 rocket

          不錯(cuò)的方法。
          是根據(jù)已知表結(jié)構(gòu)的情況下進(jìn)行代碼生成。
          屬于模板方式生成代碼技術(shù)。
          其實(shí)業(yè)內(nèi)常用的模板方式生成代碼的方法是xdoclet和annotation,使用注釋來(lái)提取模板元素,再使用其它的模板框架(比如velocity)來(lái)生成代碼。
          如果作者是這個(gè)代碼生成工具的維護(hù)者,希望能再多借鑒一些代碼生成技術(shù),畢竟用js生成代碼的創(chuàng)意很好。  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具 2008-03-07 13:01 wade

          @rocket
          最初設(shè)計(jì)這個(gè)工具的時(shí)候, 有如下考慮:
          1. 跨平臺(tái)(C++, Java, PHP)
          2. 最終要下載或安裝的文件要小, 不能有太多的依賴庫(kù), 那樣可能讓用戶失去信心(C++, PHP)
          3. 界面要簡(jiǎn)單, (C++)
          4. 使用常用的腳本語(yǔ)言, 不增加對(duì)用戶的要求(Javascript)

          于是, 排除了c#, java, 個(gè)人覺得xdoclet和annotation不是很直觀, 可能適合企業(yè)中批量的生成代碼, 但上手會(huì)有一定的難度.

          所以最終選擇了 c++來(lái)開發(fā), 使用javascript作為腳本語(yǔ)言, 目前下載文件5M左右, 缺點(diǎn)就是對(duì)數(shù)據(jù)庫(kù)的支持需要一個(gè)一個(gè)添加

          如果您有什么改進(jìn)這個(gè)工具的想法, 請(qǐng)和我聯(lián)系.
          最后感謝您的建議, 我會(huì)參考一些其他工具的做法的.
            回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具 2008-03-13 22:03 wade

          新增了如下內(nèi)容:
          1. 通過(guò)Ado連接各種數(shù)據(jù)庫(kù)的支持.測(cè)試了SQL Server, 感覺速度比mysql直接連要慢, Access的MDB很快。
          2. 支持批量生成部分/全部模板, 保存選中的模板到Working Set(Eclipse里的名字),用來(lái)保存當(dāng)前選中的目錄和模板  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具[未登錄] 2008-05-20 13:18 roger

          有沒有辦法通過(guò)附加表名來(lái)獲取字段的方法,比如當(dāng)前表table1的字段獲取通過(guò)sys_fields[i].name,當(dāng)前表名sys_table_name,如果在同一個(gè)模板中此時(shí)我希望獲取table2的字段,我應(yīng)該怎么做呢?  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具 2008-05-27 11:19 wade

          @roger
          目前還不支持,我已經(jīng)把這一點(diǎn)記下來(lái)了,下一個(gè)版本會(huì)加上去,謝謝  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具 2008-06-16 18:28 路過(guò)

          這個(gè)好像和你這個(gè)差不多,但憑借java可能功能更強(qiáng)大。
          Any-java代碼自動(dòng)生成工具(java模板語(yǔ)言)發(fā)布
          一、Any-java代碼自動(dòng)生成工具(java模板語(yǔ)言)簡(jiǎn)介
          簡(jiǎn)單說(shuō)明:
          模板解釋性語(yǔ)言,在模板中沒有特殊標(biāo)記的部分,原封不動(dòng)輸出,
          標(biāo)記的部分允許所有的java語(yǔ)法,并解釋執(zhí)行。
          用途:代碼自動(dòng)生成
          比如:開發(fā)完了一個(gè)類文件,但還有很多類似的類要做,只是要改變一些個(gè)別的地方,
          那么,可以把需要改動(dòng)的地方用java變量標(biāo)記,然后運(yùn)行該模板,自動(dòng)生成多個(gè)類。
          同時(shí),我們也提供了一些工具類(比如excel讀取),則設(shè)計(jì)書和模板聯(lián)動(dòng),可以大大提高開發(fā)速度。
          當(dāng)然,如果沒有設(shè)計(jì)書,也可以直接讀取DB的表結(jié)構(gòu)來(lái)自動(dòng)生成代碼。

          該工具不同與某些java代碼自動(dòng)生成的工具,規(guī)定死了模板,只能生成指定的代碼,
          思路是:把先開發(fā)出來(lái)的java類,作簡(jiǎn)單的變量替換,就生成新的模板,從而生成新的java類。
          也不只限于java類,任何重復(fù)的代碼部分都可以做成模板。

          起名為“any"的理由
          1。簡(jiǎn)單:只要懂java任何人都可以在2小時(shí)內(nèi)學(xué)會(huì)。 anyone can use it easily.
          2。靈活:任何文件都可以輕易的轉(zhuǎn)化為模板。 anything is template.
          3。強(qiáng)大:幾乎能實(shí)現(xiàn)你所有想自動(dòng)化的部分,只要你有靈感。anything is real.
            回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具 2008-09-09 08:10 aiya

          您的函數(shù)不能夠返回中文,這是否是一個(gè)bug?  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具 2009-04-14 10:31 wade

          @aiya
          已經(jīng)在最新版本(V 1.1.20081228)中修好了,謝謝  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具 2009-04-14 10:32 wade

          @roger
          已經(jīng)在最新版本(V 1.1.20081228)中修好了,
          通過(guò)db.getTable('your_table_name') 獲取任何一張表的內(nèi)容.
          謝謝  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具[未登錄] 2009-08-23 20:26 tin555

          不知道為什么..我用ADO連接ORACLE...界面上生成慢到爆.非常非常的慢..是這個(gè)軟件本身很慢???  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具[未登錄] 2009-08-23 20:28 tin555

          操作上很慢.....

          關(guān)注中......
          我的郵箱:tin555.d@gmail.com  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具 2009-10-20 17:14 aiya

          getcomment能否支持oracle
          您現(xiàn)在只有Mysql和ado的插件,oracle得不到comment  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具 2009-10-21 09:49 wade

          @aiya
          我目前正在整理程序結(jié)構(gòu),增加緩存, 因?yàn)楦鶕?jù) tin555的意見, ado連接oracle特別慢, 增加完緩存后我會(huì)把oracle的comment獲取出來(lái), 但可能需要一兩個(gè)月的時(shí)間

          @tin555
          可能需要一兩個(gè)月的時(shí)間,我會(huì)調(diào)整程序結(jié)構(gòu),通過(guò)緩存數(shù)據(jù)庫(kù)信息, 提高速度, 軟件本身速度不慢,但每次都要訪問(wèn)數(shù)據(jù)庫(kù)比較慢  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具[未登錄] 2010-05-27 00:03 愚公

          功能多,設(shè)置多,沒有中文文檔,用起來(lái)不容易。  回復(fù)  更多評(píng)論   

          # re: 基于JavaScript的代碼自動(dòng)生成工具 2010-07-19 17:58 pyd

          希望能加上表之間的關(guān)系關(guān)聯(lián),這樣會(huì)更完善  回復(fù)  更多評(píng)論   

          導(dǎo)航

          <2010年5月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          統(tǒng)計(jì)

          常用鏈接

          留言簿(7)

          隨筆分類

          隨筆檔案

          相冊(cè)

          Photo

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 孝义市| 科尔| 石城县| 大理市| 海门市| 仁化县| 甘谷县| 普兰县| 曲靖市| 洞口县| 社旗县| 乐亭县| 玛纳斯县| 额敏县| 鄢陵县| 马边| 富蕴县| 临沭县| 黑水县| 怀远县| 勐海县| 东阿县| 腾冲县| 松原市| 会理县| 镇康县| 读书| 舟山市| 临武县| 大竹县| 钟山县| 韩城市| 绥德县| 炉霍县| 云安县| 三门县| 交城县| 八宿县| 万年县| 荆州市| 晋州市|