2011-05-04 67 views
4

我想在java中構建一個簡單的代碼生成器,它可以獲取數據庫連接字符串,然後爲數據庫中的每個表創建模型層,我不知道該怎麼做,因此,如果任何人有任何教程或可以幫助我完成這個任務的鏈接,我將感激如何在java中構建簡單的代碼生成器

由於提前


我發現代碼項目一個很好的例子,可以採取的數據庫,使一個很好的代碼生成的數據庫中的表,但不幸的是它是用C#編寫的,並且還生成C#代碼

我不知道這是否是正確生成C#代碼,然後用任何轉換軟件將其轉換爲Java或正確的事是設法修改它生成Java類,而不是C#類

由這樣的鏈接,例如是http://www.codeproject.com/KB/codegen/TierGenerator.aspx

我馬上需要你的意見,你可以

由於提前

+0

類似於http://stackoverflow.com/questions/5870939/java-code-generator和http://stackoverflow.com/questions/5817876/sql-database-and-java – 2011-05-04 10:46:18

回答

10

爲了快速和簡單的代碼生成器:只需編寫Java源代碼轉換成一個StringBuilder和轉儲它滿足於.java文件。我從來沒有使用簡單autogenerators第三方庫:

StringBuilder sourceBuilder = new StringBuilder(); 
sourceBuilder.append("package com.example.beans;\n\n"); 
sourceBuilder.append("import java.util.*;\n\n"); 
sourceBuilder.append("public class MyBean {"); 

for (DBField dbField:getFieldsFromDatabaseModel) { // this DBField class is pure fiction! 
    // bean attribute 
    sourceBuilder.append("\tprivate ") 
       .append(dbField.getType) 
       .append(toFieldName(dbField.getName())) 
       .append(" = null;\n"); 

    // setter method 
    sourceBuilder.append("\tpublic void ") 
       .append(toSetterName(dbField.getName())) 
       .append("("); 
       .append(dbField.getType) 
       .append(toFieldName(dbField.getName())) 
       .append(")\n") 
       .append("\t\tthis.") 
       .append(dbField.getType) 
       .append(" = ") 
       .append(dbField.getType) 
       .append(";\n\t}"); 

    // getter method ... 
sourceBuilder.append("\t}\n}\n"); 
10

如果你想實現自己的代碼生成器...

在我的經驗 ...使用基於模板的工具,如速度或FreeMarker或JET減少了編寫和維護源代碼生成器的工作量。

下面是一些相關鏈接:

否則使用StringBuilder/String級聯代碼生成,是很多工作(對於一個非平凡的代碼生成任務),並傾向於給你一堆難以閱讀和難以維護的代碼。生成格式良好的(例如,正確縮進,換行)代碼也更困難,如果這與您的用例有關。

3

不要重新發明輪子,使用現有的代碼生成器。 Telosys工具做這種工作的:http://www.telosys.org/

它是一個開源項目,所以你也可以看看裏面 ,如果你想重用發電機引擎(其工作原理與Velocity模板)

2

Minuteproject被設計成符合這個要求。 它讀取數據庫元數據,可選(但實際上非常有用的)豐富模型,併爲任何基於文本的語言(例如:java,c#,php,jsf,html,js等等)生成...) 您可以享受出運解決方案(JPA2Openxava的盒子,Primefaces

而且還可以:

  • 創造更多的文物(你自己的匹配你的架構/設計);
  • 決定那裏的命名約定;
  • 如果有模型,包,應用程序,表,列,視圖特定;
  • 如果他們想要正確引用它們,任何工件都可以找到有關其他工件的信息。