如何为不同实体创建单个添加方法?

问题描述 投票:2回答:1

如何创建将在jdbc中插入不同实体的单个add方法?我想为此使用注释和反射。我创建了2个注释:

(...)
public @interface Column {
    String name();
    boolean isPrimaryKey() default false;
}

(...)
public @interface Table {
    String name();
}

假设我们有2个实体/模型/等。 :客户和服务员。对于这两种方法,我们都应该制作2个add方法,每个方法都有自己的INSERT。如果我们有4个实体,则每个实体应有4个add方法。而不是拥有4种添加方法,我怎样才能只使用一种添加方法?并使用注释和反射。

例如:

@Table(name = "Table_Client")
public class Client{
    @Column(name = "ID", isPrimaryKey = true)
    private long id;

    @Column(name = "FULL_NAME")
    private String name;
}

@Table(name = "Table_Waiter")
public class Waiter {

    @Column(name = "FULL_NAME", isPrimaryKey = true)
    private String name;

    @Column(name = "AGE")
    private int age;
}

case: db.add(Client c1) => add to the database in the table Table_Client the client c1
      db.add(Waiter w1) => add to the database in the table Table_Waiter the waiter w1
      and so on...

我的想法是获取给定对象的类,并对其进行扫描以查找TYPE批注以获取表的名称。然后,获取所有字段的注释并进行动态INSERT INTO VALUES查询,但是问题是我实际上不能这样做,因为我无法传递对象的参数。另一个问题:如果可以做到,更新和删除方法可以遵循相同的路径吗?

java jdbc
1个回答
0
投票

我不禁提及您在未来的道路上可能发现多少洞。但是从评论来看,这就是您要探索的路径。

首先,关于现有代码,您需要对注释,列和表应用保留元注释。例如:

@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String name();
    boolean isPrimaryKey() default false;
}

此元注释将确保您可以在运行时通过反射读取注释。

然后,您需要检查在类和字段级别上搜索这些注释的类。

Class类将满足您的所有需求。您应该知道可以通过调用getClass方法从任何对象中获取它。它包含一些您要实现的重要方法:

  • [getAnnotation(Class c)将返回注释(如果存在),否则返回null。
  • getDeclaredFields将返回所有声明的类字段,甚至是私有的。

在字段级别,Field类提供以下方法:

  • getAnnotation(Class c),与上面相同,如果存在,将返回注释,否则返回null。
  • [getType将返回与该字段关联的类

现在考虑以下代码:

public static void inspectClass(Class<?> cls) {
    Table t = cls.getAnnotation(Table.class);

    if (t != null) {
        System.out.print(t.name() + " --> ");
        for (Field f: cls.getDeclaredFields()) {
            Column c = f.getAnnotation(Column.class);
            if (c != null) {
                System.out.print(c.name()
                        + " "
                        + f.getType().getSimpleName()
                        + (c.isPrimaryKey() ? " PK" : "") + ", ");
            }
        }
    }
}

例如,将其应用于您的Client类,将返回类似:

Table_Client --> ID long PK, FULL_NAME String,

当然,这需要一些工作,但是这里有想法。

编辑:

为了在运行时通过反射访问实例的值,以创建动态INSERT语句,可以通过在Field类上调用get方法来完成。但是,在处理私有字段时,必须先调整隐私模式:

f.setAccessible(true);
Object value = f.get(myInstance);
© www.soinside.com 2019 - 2024. All rights reserved.