Java Servlet 静态 DAO

Java Servlet Static DAO

我已经尝试阅读有关在我的 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);
    }
}
}

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

编辑

这是连接管理器class

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;

}

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

在你的例子中,在我看来,拥有一个带有静态方法的 DAO class 是个坏主意。如果方法是静态的,则它们引用的任何内容都必须是静态的。如果你想重用你的 DAO class 连接到几个不同的数据库怎么办?

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

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