生成某些实例变量的列表

时间:2016-11-25 11:57:30

标签: java oop

我正在创建一个将数据写入数据库的程序。我已经为每个表创建了类,我希望该类能够创建自己的INSERT语句。由于成员变量将是数据库的列,我认为用obj.getClass().getDeclaredFields()获取它们并将它们写入INSERT语句是个好主意。我不想复制代码,因此我创建了一个具有buildSqlInsertQuery()的Table类,并使用它来扩展其他类。

问题是我可能在这些类中需要其他实例变量(例如tableName),我不想成为INSERT语句的一部分。我还想为列分配值,所以我不认为我可以将它们放在一个数组中而不重复(所以如果我添加一个列,我还需要将它添加到数组

这就是我目前所拥有的内容,它将在INSERT查询中包含tableName:

Table.java

public class Table {
    public String buildSqlInsertQuery(Object obj, String tableName) {
        Field[] fields = obj.getClass().getDeclaredFields();
        String[] fieldNames = new String[fields.length];
        String[] placeholders = new String[fields.length];
        String placeholder = "?";

        for (int x = 0; x < fields.length; x += 1) {
            fieldNames[x] = fields[x].getName();
            placeholders[x] = placeholder;
        }

        return joinInsertQuery(tableName, fieldNames, placeholders);
    }

    private String joinInsertQuery(String tableName, String[] fieldNames, String[] placeholders) {
        String query = "INSERT INTO " + tableName + " (";
        query += StringUtils.join(fieldNames, ",");
        query += ") VALUES (";
        query += StringUtils.join(placeholders, ",");
        query += ")";

        return query;
    }
}

Addresses.java

public class Addresses extends Table {
    private final static String tableName = "Addresses";
    public String idCustomers;
    public String address1;
    public String address2;
    public String address3;
    public String city;
    public String state;
    public String zip;
    public String country;

    public Addresses() {
        System.out.println(buildSqlInsertQuery(this, this.tableName));
    }
}

有没有办法可以标记某些应该被视为列的实例变量(,例如带有注释),还是我完全错了?

2 个答案:

答案 0 :(得分:2)

您提到过的一种方法是使用注释将实例变量标识为table name。只需将注释定义为:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TableAnnotation {

}

并使用以下内容注释具有表名称的字段:

public class Addresses {

@TableAnnotation
private String tableName = "Addresses";
public String idCustomers;
public String address1;
...
}

现在在你的Table课程中,使用反射(你已经在做的)来找出具有这个特定注释的字段:

if(field.isAnnotationPresent(TableAnnotation.class)){
      System.out.println("This field " + field.getName() + " is the name of   table");
}

答案 1 :(得分:1)

您可以创建自己的注释并注释您的字段。 然后你可以找到带反射的注释字段。

for (Field field : c.getDeclaredFields()) {
  if (field.isAnnotationPresent(Annotation)) {
    set.add(field);
  }
}