Java Servlet静态DAO

时间:2016-03-17 20:14:59

标签: java servlets static dao

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

以下是我的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;

}

1 个答案:

答案 0 :(得分:1)

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

在你的情况下,使用静态方法的DAO类是我的一个坏主意。如果方法是静态的,那么它们引用的必须是静态的。如果要重用DAO类连接到多个不同的数据库,该怎么办?

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

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