如何在java中构建简单的代码生成器

时间:2011-05-04 10:40:07

标签: java code-generation

我想在java中构建一个简单的代码生成器,它可以获取数据库连接字符串,然后为数据库中的每个表创建模型层,我不知道怎么能这样做,所以如果任何人有任何教程或可以帮助我完成这项任务的链接我将非常感激

先谢谢


我在代码项目中找到了一个很好的例子,它可以占用数据库并为数据库中的表生成良好的代码,但遗憾的是它是用C#编写的,并且还生成了C#代码

我不知道生成C#代码然后使用任何转换软件将它们转换为java是正确的,或者正确的做法是尝试修改它以生成java类而不是C#类

顺便提一下示例的链接是http://www.codeproject.com/KB/codegen/TierGenerator.aspx

我需要你的建议

先谢谢

4 个答案:

答案 0 :(得分:10)

快速简单的代码生成器:只需将java源代码写入StringBuilder并将其内容转储到.java文件即可。我从未将第三方库用于简单的自动生成器:

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");

答案 1 :(得分:10)

如果你想实现自己的代码生成器......

根据我的经验 ...使用基于模板的工具(如Velocity或FreeMarker或JET)可以减少编写和维护源代码生成器的工作量。

以下是一些相关链接:

使用StringBuilder / String连接进行代码生成是很多工作(对于非平凡的代码生成任务)并且往往会给你一堆难以阅读的代码而且难以维持。如果与您的用例相关,则生成格式良好(例如,正确缩进,换行)代码也更加困难。

答案 2 :(得分:2)

不要重新发明轮子,使用现有的代码生成器。 Telosys Tools完成这类工作:http://www.telosys.org/

这是一个开源项目,所以你也可以看看里面 如果你想重用生成器引擎(它适用于Velocity模板)

答案 3 :(得分:2)

Minuteproject旨在满足此要求。 它读取数据库元数据,可选地(但实际上极其有用)丰富模型并生成任何基于文本的语言(例如:java,c#,php,jsf,html,js等...) 您可以从已发布的解决方案中获益(JPA2OpenxavaPrimefaces

但你也可以:

  • 创建额外的工件(您自己的工程/设计);
  • 决定命名约定;
  • 如果有模型,包,应用程序,表,列,视图特定;
  • 任何工件如果想要正确引用它们,都可以找到有关其他工件的信息。