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

问题描述 投票:0回答:4

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

提前致谢


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

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

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

我需要尽快得到你的建议

提前致谢

java code-generation
4个回答
17
投票

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

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

以下是一些相关链接:

使用

StringBuilder
/
String
连接进行代码生成需要大量工作(对于不平凡的代码生成任务),并且往往会给您带来一堆难以阅读和维护的代码。如果与您的用例相关,生成格式良好(例如,正确缩进、换行)的代码也更困难。


13
投票

对于快速简单的代码生成器:只需将 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");

3
投票

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

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


2
投票

Minuteproject就是为了满足这个需求而设计的。 它可以选择性地读取数据库元数据(但实际上非常有用)丰富模型并为任何基于文本的语言生成(例如:java、c#、php、jsf、html、js 等...) 您可以从已提供的解决方案中受益(JPA2OpenxavaPrimefaces 但你也可以:

创建额外的工件(您自己的、与您的架构/设计相匹配的工件);
  • 决定命名约定;
  • 是否有模型、包、应用程序、表、列、视图特定;
  • 任何工件如果想要正确引用其他工件,都可以找到其他工件的信息。
© www.soinside.com 2019 - 2024. All rights reserved.