Я создаю программу, которая записывает данные в базу данных. Я создал классы для каждой таблицы, и я хотел, чтобы класс мог создать свою собственную инструкцию INSERT. Поскольку переменные-члены будут столбцами базы данных, я подумал, что было бы неплохо захватить их с помощью obj.getClass().getDeclaredFields()
и записать их в инструкцию INSERT. Я не хотел дублировать код, поэтому я создал класс Table, который имеет buildSqlInsertQuery()
и использовал его для расширения других классов.Создание списка определенных переменных экземпляра
Проблема в том, что в этих классах могут быть другие переменные экземпляра (например, tableName
), которые я не хочу входить в инструкцию INSERT. Я также хочу присвоить значения столбцам, поэтому я не думаю, что могу просто поместить их в массив без дублирования (, поэтому, если я добавлю столбец, мне также нужно будет добавить его в массив).
Вот что у меня есть на данный момент, который будет включать в себя TABLENAME в запросе 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