Tao

          Tao obeys its own inherent Nature

          基于JavaScript的代碼自動生成工具

          JavaScript Based Code Generator - codegen

          工具主頁

          http://thelei.sourceforge.net

          目的

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

          簡單介紹

          本工具生成代碼的思想是讀取數(shù)據(jù)庫中表的結(jié)構(gòu), 使用JavaScript作為腳本語言編寫模板, 生成各種代碼或者文件, 支持各種格式的文本文件, Java, C#, PHP 等, 只要是文本文件, 都可以生成, 因為生成什么是由你完全自己定義的. 對數(shù)據(jù)庫的訪問是通過插件的形式進行的, 所以易于擴充, 目前支持Mysql, 以及支持Ado連接的數(shù)據(jù)庫. 

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

          什么時候用它

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

          為什么用它

          答案很簡單, 因為這個程序簡單容易使用, 而且完全自定義, 能滿足不同項目對代碼的要求, 只要你能描述出要生成的代碼結(jié)構(gòu)和形式的共性,就能把模板寫出來.

          簡單的例子

          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%>;

          }

          <$

          }

          $>

          }
          如果當前的表名是:Role, 同時它有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$> 顯示表達式的值

          預(yù)定義的變量

          1. sys_table_name: 當前表名
          2. sys_fields: 當前表的Field 對象數(shù)組. 使用sys_fields.length 來獲取字段的數(shù)目.
          3. sys_keys: 當前表主鍵的數(shù)組, 使用sys_keys.length來獲取主鍵字段的數(shù)量.
          4. sys_user_name: 當前連接數(shù)據(jù)庫的用戶名
          5. sys_db_name: 當前連接到數(shù)據(jù)庫的名字
          6. sys_output: 內(nèi)部使用,存儲生成的中間JavaScript代碼
          7. Field 對象屬性, 如果有一個字段: 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: 字段長度, integer, 如: sys_fields[i].size, 例子值是 100
                scale: 精度, integer, 如: sys_fields[i].scale, 本例子是varchar 類型,本項為空
                default_value: 默認值, 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等等. 你也可以通過Tools/Edit public functions增加自己常用的方法

          使用步驟

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

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

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

          生成文件

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

          Tips

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

            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. 在項目屬性對話框中寫一些項目使用的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, 如果當前的表是user, 目標路徑將是: user/UserAction.java, 如果表名是 log, 目標路徑將是: LogAction.java

          改進這個工具:

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

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

           

          最后希望這個工具對你能夠有所幫助, 同時減少編碼時Copy&Paste的時間

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

          評論

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          @roger
          目前還不支持,我已經(jīng)把這一點記下來了,下一個版本會加上去,謝謝  回復(fù)  更多評論   

          # re: 基于JavaScript的代碼自動生成工具 2008-06-16 18:28 路過

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

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

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

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

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

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

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

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

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

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

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

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

          操作上很慢.....

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

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

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

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

          @aiya
          我目前正在整理程序結(jié)構(gòu),增加緩存, 因為根據(jù) tin555的意見, ado連接oracle特別慢, 增加完緩存后我會把oracle的comment獲取出來, 但可能需要一兩個月的時間

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

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

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

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

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

          導(dǎo)航

          <2008年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統(tǒng)計

          常用鏈接

          留言簿(7)

          隨筆分類

          隨筆檔案

          相冊

          Photo

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 贵溪市| 濮阳县| 麟游县| 元氏县| 岳阳县| 内乡县| 灌阳县| 洛川县| 锦屏县| 南阳市| 九江县| 施甸县| 嘉兴市| 阳城县| 汕尾市| 余干县| 神池县| 竹北市| 旌德县| 田东县| 阿拉尔市| 英吉沙县| 十堰市| 贵阳市| 容城县| 宣恩县| 邢台市| 芜湖市| 五莲县| 广元市| 开远市| 万盛区| 清涧县| 嵩明县| 石门县| 丰城市| 阿拉善盟| 乌苏市| 遵义市| 通山县| 和林格尔县|