DAO层可以返回一个JDBC ResultSet(Java)

我的Java项目有一个使用Java API JDBC的DAO层; JDBC返回ResultSets以从数据库中获取信息。

考虑到使用图层的编程范例,返回业务层的ResultSet对象并将信息提取到其中是否正确?

根据图层定义,业务层有责任将信息包装到域对象(bean等)中。 但另一方面,它没有看到DAO组件。

我附上这段代码来展示我的范例:

    public static Hashtable<String, TreeSet<String>> getCodesByEditorial(Vector<Integer> familiesVector) throws Exception {
        DriverManager.registerDriver((Driver) Class.forName("ianywhere.ml.jdbcodbc.IDriver").newInstance());    
        Connection con  = DriverManager.getConnection("jdbc:odbc:DSN=DBLIB");
        String sqlQuery = 
            "SELECT re.codigo, li.editorial FROM li_li li " +
            "LEFT OUTER JOIN tl_recambio re ON li.codigo = re.codigo " +
            "WHERE li.editorial IS NOT NULL AND re.familia IN (" + buildFamilies(familiesVector) + ")" ;
        PreparedStatement ps = con.prepareStatement(sqlQuery);
        ResultSet res = ps.executeQuery();

        //THIS CODE SHOULD BE INTO DAO LAYER????
        Hashtable<String, TreeSet<String>> codesHashTree = new Hashtable<String, TreeSet<String>>();  
        while (res.next()) {
            String code = res.getString("CODIGO");
            String editorial = res.getString("EDITORIAL");
            if (editorial != null) {            
                TreeSet<String> bookTreeSet = codesHashTree.get(editorial);
                if (bookTreeSet == null) {
                    bookTreeSet = new TreeSet<String>();
                }
                bookTreeSet.add(code);
                codesHashTree.put(editorial, bookTreeSet);
            }
        }
        con.close();
        return codesHashTree;
    }

不,业务层不应该处理ResultSets 。 该层的职责是处理业务逻辑,与数据来自哪里(在这种情况下是数据库)无关。

处理此问题的一种方法是从数据源层返回Data Transfer Objects (DTO),然后在业务层中处理它们。 这样,数据可以来自多种来源(数据库,平面文件,Web服务,其他集成),业务层无需更改。


我认为这是一个坏主意,因为JDBC类( ResultSet就在其中)是用来从数据库中检索数据的。 现在,当你调用DAO方法时,你很可能期望得到一个领域模型对象或它们的一些集合(我正在谈论findXXX的方法)。

常见的最佳做法是不将数据源通信暴露给外层(很可能是服务层)。 理由:您可能曾经用键值存储,文本文件或其他方式替换数据库。 如果留在返回的ResultSet ,则必须更改很多签名。


看第一件事

如果你有像connection对象, resultsetDAO层内的所有DB相关逻辑

那么处理DAO层内部并关闭所有这些打开的connectionDAO层本身内的result set显然会更好。

如果您将result set返回到业务层,那么您无法在DAO层本身关闭resultset

这意味着你正在将你的DAO逻辑重新转换回有意做的业务层

业务相关的东西。

以及如果在关闭result set时发生某种异常(因为您已返回),该怎么办?

业务层,它会在业务层中造成问题。

并且您需要处理业务层中的所有DAO exceptions

所以请避免使用业务层中的resultset或任何与DB相关的内容。

并纯粹用于商业逻辑。

链接地址: http://www.djcxy.com/p/76577.html

上一篇: DAO layer can return a JDBC ResultSet (Java)

下一篇: Resultset in JSP