【问题标题】:Java Servlet Static DAOJava Servlet 静态 DAO
【发布时间】:2016-03-17 20:14:59
【问题描述】:

我已尝试阅读有关在我的 Web 应用程序中使用静态或不使用静态的信息,并想快速询问我的实现是否良好。

以下是我的servlet

Integer total = HousingDAO.getTotal(AppUtils.getId(request));
Integer used = HousingDAO.getUsed(AppUtils.getId(request));

request.setAttribute("total", total);
request.setAttribute("used", used);
request.getRequestDispatcher("system/housing.jsp").forward(request, response);

这是我的 DAO

public class HousingDAO {

public static Integer getTotal(String id){
    String sql_total = "SELECT count(*) FROM housing " + 
            "WHERE id = :id ";
    try (Connection con = ConnectionManager.getSql2o().open()) {
        return con.createQuery(sql_total).addParameter("id", id).executeScalar(Integer.class);
    }
}

public static Integer getUsed(String id){
    String sql_total = "SELECT count(*) FROM housing " + 
            "WHERE id = :id AND person IS NOT NULL";
    try (Connection con = ConnectionManager.getSql2o().open()) {
        return con.createQuery(sql_total).addParameter("id", id).executeScalar(Integer.class);
    }
}
}

所以这些都是静态的,不需要像这样是静态的吗?

HousingDAO dao = new HousingDAO();
Integer total = dao.getTotal(AppUtils.getId(request));
Integer used = dao.getUsed(AppUtils.getId(request));

request.setAttribute("total", total);
request.setAttribute("used", used);
request.getRequestDispatcher("system/housing.jsp").forward(request, response);

有了这个 DAO

public class HousingDAO {

public Integer getTotal(String id){
    String sql_total = "SELECT count(*) FROM housing " + 
            "WHERE id = :id ";
    try (Connection con = ConnectionManager.getSql2o().open()) {
        return con.createQuery(sql_total).addParameter("id", id).executeScalar(Integer.class);
    }
}

public Integer getUsed(String id){
    String sql_total = "SELECT count(*) FROM housing " + 
            "WHERE id = :id AND person IS NOT NULL";
    try (Connection con = ConnectionManager.getSql2o().open()) {
        return con.createQuery(sql_total).addParameter("id", id).executeScalar(Integer.class);
    }
}
}

只是想知道第一个是否可以,还是我需要像第二个一样?

编辑

这是 ConnectionManager 类

public static Sql2o getSql2o(){
    try {
        Class.forName(driver);
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        return new Sql2o(PropertiesManager.getProperty("dburl")
                + PropertiesManager.getProperty("dbname"),
        PropertiesManager.getProperty("dbusername"),
        PropertiesManager.getProperty("dbpassword"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;

}

【问题讨论】:

    标签: java servlets static dao


    【解决方案1】:

    很少有使用静态方法的充分理由。它最常用于实用程序类和本质上是单例的类,如 javas System 类。

    在您的情况下,在我看来,拥有一个带有静态方法的 DAO 类是个坏主意。如果方法是静态的,那么它们引用的任何东西都必须是静态的。如果您想重用您的 DAO 类来连接多个不同的数据库怎么办?

    更好的方法是在 DAO 类中注入所有依赖项,例如静态 ConnectionManager,并让应用程序决定如何将实例连接在一起,而不是类本身。

    所以简短的回答是,使用第二种解决方案,但还要删除对 ConnectionManager 的静态访问。

    【讨论】:

    • 感谢您的回复。只是为了澄清一下,从长远来看,第一个选项不会导致线程泄漏或出现任何问题,除了无法更改数据库并且不是最佳编码标准吗?
    • 我不知道你所说的线程泄漏是什么意思,但是如果 ConnectionManager 是线程安全的,那么这些方法是线程安全的,即 ConnectionManager.getSql2o().open() 需要是线程安全的。
    • 我用 ConnectionManager 类编辑了帖子
    • 所以,这里是一样的。如果 PropertiesManager.getProperty(String) 是线程安全的,则 getSql2o() 是线程安全的。这是为什么像这样使用静态是一个坏主意的一个例子。
    • 好的,谢谢您的帮助。所以就我而言,PropertiesManager 是线程安全的,所以我不会对这段代码有任何问题,只是它不是好的编码标准。
    猜你喜欢
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2011-12-22
    • 1970-01-01
    • 2011-02-01
    • 2012-04-10
    • 2018-07-19
    相关资源
    最近更新 更多