DAO 模式——我应该把静态变量放在哪里?

DAO pattern - where should I put static variables?

我有一个使用 JSP 模型 2 架构的网络应用程序。

我也使用 DAO 模式;特别是,不同的方法需要像 productID 这样的值,我希望它是唯一的。

/**
 * Updates the productID that is unique per JVM run.
 * @return the updated value of <i>productID</i>
 * @throws ClassNotFoundException if an error occurs with the connection to the database
 */
public static synchronized int createProductID() throws ClassNotFoundException{
    int maxID = QueriesDAO.maxIDInDatabase("product");
    while(productID <= maxID) {
        productID++;
    }
    return productID++;
}

该方法查询数据库并返回一个新 ID,该 ID 存储在 private static int productID = 0; 中(0 是分配的第一个值)。

我想问的是:我应该把那个查询和那个变量放在哪里?

目前,我有一个名为 DAO 的包,其中包含所有查询,例如 UserDAO.java 上的用户查询或 ProductDAO.java 上的产品等等. createProductID() 方法和链接的变量存储在 Main class 中,但在我看来那不是正确的地方。我怎样才能改变我的模式?

使用接口可以解决吗?但是有了接口,我不能拥有可以承载 productID 变量的私有字段..

为什么要查询最大id?

您的数据库或持久性提供程序应该能够提供一个自动递增的顺序值,该值将在将产品插入数据库时​​自动分配给您的产品,这意味着您在插入之前永远不需要知道 ID 是什么.

MySQL auto increment

如果有充分的理由在插入之前需要 id:

考虑使用 GUID。这些不是顺序生成的 ID(在大多数情况下),因此无需担心首先从数据库中查询您的最大 ID。

关于您应该将其存储在哪里 - 您不需要这样做。 Java 的 UUID class 是 util 包的一部分,可以在任何地方静态调用并且是线程安全的。

查看文档 here [Java文档]

还可以找到一篇关于使用 UUID 的好文章here[编码恐怖]