Java 如何为不同的实体创建一个add方法?

Java 如何为不同的实体创建一个add方法?,java,jdbc,Java,Jdbc,如何创建一个将在jdbc中插入不同实体的add方法?我想为此使用注释和反射。 我创建了两个注释: (...) public @interface Column { String name(); boolean isPrimaryKey() default false; } 及 假设我们有两个实体/模型/等等:客户和服务员。对于这两种方法,我们都应该创建两个add方法,每个方法都有自己的INSERT。 如果我们有4个实体,那么每个实体应该有4个add方法。如果没有4个add方法,

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

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

假设我们有两个实体/模型/等等:客户和服务员。对于这两种方法,我们都应该创建两个add方法,每个方法都有自己的INSERT。
如果我们有4个实体,那么每个实体应该有4个add方法。如果没有4个add方法,如何只创建1个add方法?通过使用注释和反射

例如:

@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...
我的想法是获取给定对象的类并扫描它以获得类型注释,从而获得表的名称。然后,获取所有字段的注释并在值查询中进行动态插入,但问题是我实际上无法这样做,因为我无法传递对象的参数。

另一个问题:如果可以做到这一点,那么更新和删除方法可以遵循相同的路径?

我不能不提到您在前面的道路上可能会发现多少漏洞。但从评论来看,这就是你想要探索的道路

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

@Retention(RetentionPolicy.RUNTIME)
公共@接口列{
字符串名();
布尔值isPrimaryKey()默认值为false;
}
此元注释将确保您可以通过反射在运行时读取注释

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

类将提供您所需的一切。您应该知道可以通过调用
getClass
方法从任何对象获取它。它包含两种重要的方法来实现您的目标:

  • getAnnotation(c类)
    将返回注释(如果存在),否则返回null
  • getDeclaredFields
    将返回所有声明的类字段,甚至是私有字段
在字段级别,field类提供以下方法:

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

现在考虑下面的代码:

公共静态类(类cls){
Table t=cls.getAnnotation(Table.class);
如果(t!=null){
System.out.print(t.name()+“-->”);
for(字段f:cls.getDeclaredFields()){
列c=f.getAnnotation(Column.class);
如果(c!=null){
System.out.print(c.name()
+ " "
+f.getType().getSimpleName()
+(c.isPrimaryKey()?“PK”:“)+”,”;
}
}
}
}
例如,将其应用于客户端类将返回如下结果:

表\u客户端-->ID长主键,全名字符串,
当然,这需要一些工作,但想法是存在的

编辑:

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

f.setAccessible(true);
对象值=f.get(myInstance);

您是否正在尝试创建自己的ORM?您可以使这些类扩展实体类,并在这个超类中包含CRUD方法。但除非这样做是为了好玩,否则请使用真正的ORM。我真的不想使用JDBC和Java核心以外的任何东西。我正在读“用Java思考”,我想从中应用一些东西。啊,好吧,那就玩吧!我们都去过那里。像Hibernate这样的大东西可能太大,很难从中获得任何见解,但您可能想查看(链接站点上提供的资源)。但让我最后说一次:如果不是为了学习,就用真正的东西。如果你不这样做,你最终会后悔的。我会看看的。我一直在寻找我的问题,但一切都把我拖到了冬眠状态。这只是为了学习。非常感谢你!
@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...