如何创建将在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查询,但是问题是我实际上不能这样做,因为我无法传递对象的参数。另一个问题:如果可以做到,更新和删除方法可以遵循相同的路径吗?
我不禁提及您在未来的道路上可能发现多少洞。但是从评论来看,这就是您要探索的路径。
首先,关于现有代码,您需要对注释,列和表应用保留元注释。例如:
@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);