我正在创建一个将数据写入数据库的程序。我已经为每个表创建了类,我希望该类能够创建自己的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));
}
}
有没有办法可以标记某些应该被视为列的实例变量(,例如带有注释),还是我完全错了?
答案 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);
}
}