动态SQL应用程序

时间:2015-09-20 22:22:46

标签: java sql

我想创建一个动态的sql java应用程序。 Normaly我创建了一个带有硬编码列的java pojo。例如:

public class DbEntry{

private int id;
private String name;

public setter and getter

}

现在,问题是,用户可以根据需要更改数据库列。例如,他可以根据需要添加新列等等。但是,如果他更改列,则硬编码的pojo表示整个数据库条目。我已经阅读了动态字节代码创建,但如果有其他/更好的解决方案,我真的不想使用它。

2 个答案:

答案 0 :(得分:0)

我已经看到了这一点,这是很多工作。你最终要做的是拥有一个动态模型,通常是建模类和属性。您将类和属性(及其定义)公开给sysadmin角色。

应用程序的其余部分使用此动态模型发送和检索实例数据。首先,您不会拥有代表它们的静态Java类。在上面的示例中,DbEntry不存在。您最终会得到一个通用模型对象,它允许您在公共模型中返回DbEntry对象。像

这样的东西
class DynamicObject {
    ClassDefinition getClass(); // a ClassDefinition that contains details about DbEntry
    Collection<AttributeDetails> getAttributes();
    AttributeValue getValue(AttributeDetails details);
    void setValue(AttributeDetails details, AttributeValue value);
}

以上是您编写/定义的所有定制代码。我不知道有任何第三方框架提供给您。那就是说,我看起来并不是很难。

最重要的是,对于您想要做的事情,类和属性最终由应用程序建模,而应用程序的其余部分则使用该模型。只有这样,您才能避免在模型更改时进行静态Java更改。

这不是微不足道的,并且带有相当多的维护。我已经看到了这一点,随着时间的推移,它确实成为一项相当艰巨的任务。

答案 1 :(得分:0)

考虑这个课程:

public class DbEntry{
  List<Integer> integerList;
  List<String> strList;
  public Integer getInt(int index){
    return integerList.get(index);
  }
  public String getStr(int index){
    return strList.get(index);
  }
  //todo: add some constructors/factory methods
}

对于固定列,您可以编写一些全局常量,如staic int I_ID=0static int I_NAME=0。因此,您可以致电idname

来获取DbEntry的{​​{1}}和dbEntry.getInt(I_ID)

对于可更改列,您可以使用dbEntry.getStr(I_NAME),在列表中添加新列名称,然后拨打List<String>

或者您可以使用字符串作为键来编写类,因此您可以调用dbEntry.getStr(collst.indexOf("name")),例如:

dbEntry.getStr("name")

这个类看起来更直接但却浪费了一些内存。因为同一个表中的每个public class DbEntry{ Map<String,Integer> integerMap; Map<String,String> strMap; public Integer getInt(String key){ return integerMap.get(key); } public String getStr(String key){ return strMap.get(key); } //todo: add some constructors/factory methods } 都具有相同的列名称集。单个列表足以存储表的列名。 dbEntry使用的内存超过HashMap。尽管存在这种缺点,但使用的数据结构仍取决于您的要求。

或者您可能希望将其设为ArrayListgetIntgetStrgetDate的界面,这样您就可以通过使用不同的数据实现界面来获得灵活性结构。