Tao

          Tao obeys its own inherent Nature

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

          JavaScript Based Code Generator - codegen

          工具主頁

          http://thelei.sourceforge.net

          目的

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

          簡單介紹

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

          本工具開發于2006年, 經過兩年的內部使用, 進行了不斷改進, 現在把它公布出來, 希望能有更多的人用它, 提意見, 然后把它做的更好.

          什么時候用它

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

          為什么用它

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

          簡單的例子

          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等字段, 那么生成的結果就是:

          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);
            $> 執行一段代碼
          2. <$=sys_fields[0].name$> 顯示表達式的值

          預定義的變量

          1. sys_table_name: 當前表名
          2. sys_fields: 當前表的Field 對象數組. 使用sys_fields.length 來獲取字段的數目.
          3. sys_keys: 當前表主鍵的數組, 使用sys_keys.length來獲取主鍵字段的數量.
          4. sys_user_name: 當前連接數據庫的用戶名
          5. sys_db_name: 當前連接到數據庫的名字
          6. sys_output: 內部使用,存儲生成的中間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.

          預定義的方法

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

          使用步驟

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

          數據庫連接參數

          1. 選擇數據庫類型
          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 "";
            }
            然后設置目錄或模板的destination path為: <%=getModule(sys_table_name)%><%=getDomainByTable(sys_table_name)%>Action.java, 如果當前的表是user, 目標路徑將是: user/UserAction.java, 如果表名是 log, 目標路徑將是: LogAction.java

          改進這個工具:

          如果有下面的問題, 請和我聯系:

          1. 需要一個新的數據庫插件或者你寫了一個新的數據庫插件
          2. 不知道如何使用這個工具
          3. 發現了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寫的,也沒什么環境的要求。瀏覽器即可,以前自己也寫過這樣的工具用于處理重復的勞動。  回復  更多評論   

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          操作上很慢.....

          關注中......
          我的郵箱:tin555.d@gmail.com  回復  更多評論   

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

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

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

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

          @tin555
          可能需要一兩個月的時間,我會調整程序結構,通過緩存數據庫信息, 提高速度, 軟件本身速度不慢,但每次都要訪問數據庫比較慢  回復  更多評論   

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

          功能多,設置多,沒有中文文檔,用起來不容易。  回復  更多評論   

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

          希望能加上表之間的關系關聯,這樣會更完善  回復  更多評論   

          導航

          <2008年3月>
          2425262728291
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          統計

          常用鏈接

          留言簿(7)

          隨筆分類

          隨筆檔案

          相冊

          Photo

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 华容县| 江达县| 南汇区| 柳林县| 江孜县| 甘德县| 华亭县| 文昌市| 株洲县| 垫江县| 太白县| 茌平县| 顺昌县| 永宁县| 武夷山市| 白山市| 凤山市| 韶山市| 西乡县| 莱州市| 弥勒县| 沾化县| 九龙县| 山东| 阜城县| 定远县| 普安县| 沙河市| 宁国市| 遂宁市| 正安县| 云阳县| 南华县| 新宁县| 沅陵县| 华安县| 壶关县| 昆明市| 龙口市| 阳原县| 沅陵县|