我创建一个数据库写入数据的程序。我为每个表创建了类,我希望这个类能够创建自己的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));
}
}
有没有我可以标记某些实例变量应该考虑的列(如与注释)或我要对这个完全错误的方式?
你知道存在多个库来做这个吗?无论如何,你可以使用字段的'transient'改性剂和[检查这个在运行时(https://docs.oracle.com/javase/tutorial/reflect/member/fieldModifiers.html)。此外,'JPA'规范为此提供了[注释](https://docs.oracle.com/javaee/7/api/javax/persistence/Transient.html)。 – PeterMmm