2016-11-25 2 views
2

Я создаю программу, которая записывает данные в базу данных. Я создал классы для каждой таблицы, и я хотел, чтобы класс мог создать свою собственную инструкцию 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)); 
    } 
} 

Есть ли способ, чтобы я мог отмечать некоторые переменные экземпляра, которые следует считать столбцом (, например, с аннотацией), или я об этом совершенно неправильно?

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