2016-11-25 22 views
2

我创建一个数据库写入数据的程序。我为每个表创建了类,我希望这个类能够创建自己的INSERT语句。由于成员变量将成为数据库的列,我认为用obj.getClass().getDeclaredFields()来抓取它们并将它们写入INSERT语句是个不错的主意。我不想复制代码,所以我创建了一个具有buildSqlInsertQuery()的Table类,并用它来扩展其他类。生成某些实例变量的列表

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

这里是我的那一刻,这将包括在INSERT查询的表名:

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

有没有我可以标记某些实例变量应该考虑的列(如与注释)或我要对这个完全错误的方式?

+1

你知道存在多个库来做这个吗?无论如何,你可以使用字段的'transient'改性剂和[检查这个在运行时(https://docs.oracle.com/javase/tutorial/reflect/member/fieldModifiers.html)。此外,'JPA'规范为此提供了[注释](https://docs.oracle.com/javaee/7/api/javax/persistence/Transient.html)。 – PeterMmm

回答

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"); 
} 
+0

这真的很有帮助,谢谢。 – SBmore

+0

@SBmore欢迎您! –

1

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

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