DAO层可以返回JDBC结果集(Java)

DAO层可以返回JDBC结果集(Java),java,jakarta-ee,jdbc,dao,Java,Jakarta Ee,Jdbc,Dao,我的Java项目有一个使用JavaAPI JDBC的DAO层;JDBC返回结果集以从数据库获取信息 考虑到具有层的编程范式,将ResultSet对象返回到业务层并将信息提取到其中是否正确 根据层定义,业务层负责将信息封装在域对象(bean等)中。但另一方面,它没有看到DAO组件 我附加此代码以显示我的范例: public static Hashtable<String, TreeSet<String>> getCodesByEditorial(Vector<

我的Java项目有一个使用JavaAPI JDBC的DAO层;JDBC返回结果集以从数据库获取信息

考虑到具有层的编程范式,将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;
    }
公共静态哈希表GetCodesByEdit(向量familiesVector)引发异常{
DriverManager.registerDriver((Driver)Class.forName(“ianywhere.ml.jdbcodbc.IDriver”).newInstance();
Connection con=DriverManager.getConnection(“jdbc:odbc:DSN=DBLIB”);
字符串sqlQuery=
“从li_li li中选择re.codigo,li.Edit”+
“li.codigo=re.codigo上的左外连接tl_recambio re”+
“其中li.editorial不为NULL,并且在(“+buildFamilies(familiesVector)+”)中重新定义familia”;
PreparedStatement ps=con.prepareStatement(sqlQuery);
ResultSet res=ps.executeQuery();
//这个代码应该进入DAO层吗????
Hashtable codesHashTree=新的Hashtable();
while(res.next()){
字符串代码=res.getString(“CODIGO”);
字符串编辑=res.getString(“编辑”);
如果(编辑!=null){
TreeSet bookTreeSet=codesHashTree.get(编辑);
if(bookTreeSet==null){
bookTreeSet=新树集();
}
bookTreeSet.add(代码);
codesHashTree.put(编辑,图书目录集);
}
}
con.close();
返回代码shashtree;
}

不,业务层不应该处理
结果集。该层的职责是处理业务逻辑,与数据的来源(在本例中是数据库)无关


处理这个问题的一种方法是从数据源层返回
数据传输对象
(DTO),然后在业务层处理它们。这样,数据可以来自多种来源(数据库、平面文件、web服务、其他集成),业务层不需要更改。

不,业务层不应该处理
结果集。该层的职责是处理业务逻辑,与数据的来源(在本例中是数据库)无关


处理这个问题的一种方法是从数据源层返回
数据传输对象
(DTO),然后在业务层处理它们。通过这种方式,数据可以来自多种来源(数据库、平面文件、web服务、其他集成),业务层不需要更改。

我认为这是个坏主意,因为JDBC类(
ResultSet
就是其中之一)被设计用来从数据库检索数据。现在,当您调用DAO方法时,您很可能希望得到一个域模型对象或它们的一些集合(我说的是
findXXX
-like方法)


常见的最佳实践是不将数据源通信公开给外层(很可能是服务层)。原因:您可以用键值存储、文本文件或其他方式替换数据库。如果您继续返回
ResultSet
,您将不得不更改许多签名。

我认为这是一个坏主意,因为JDBC类(
ResultSet
就是其中之一)被设计用来从数据库中检索数据。现在,当您调用DAO方法时,您很可能希望得到一个域模型对象或它们的一些集合(我说的是
findXXX
-like方法)

常见的最佳实践是不将数据源通信公开给外层(很可能是服务层)。原因:您可以用键值存储、文本文件或其他方式替换数据库。如果您继续返回
ResultSet
,您将不得不更改许多签名。

请参阅第一件事

如果您在
DAO
层中有所有
DB
相关逻辑,如
connection
对象、
resultset

然后,显然最好在
DAO
层内部处理,并关闭所有这些打开的
连接
结果集
内部
DAO
层本身

如果将
结果集
返回到业务层,则无法关闭
DAO
层本身中的
resultset

这意味着您正在将您的
DAO
逻辑委托给业务层,而业务层正打算这样做

商业相关的东西

如果在关闭
结果集
时发生异常,又该怎么办呢,因为您已返回到

业务层,它在业务层产生问题

您需要在业务层内处理所有
DAO
异常

因此,避免在业务层中使用
resultset
或任何
DB
相关内容

并将其纯粹用于业务逻辑。

请参阅第一件事

如果您在
DAO
层中有所有
DB
相关逻辑,如
connection
对象、
resultset

然后,显然最好在
DAO
层内部处理,并关闭所有这些打开的
连接
结果集
内部
DAO
层本身

如果将
结果集
返回到业务层,则无法关闭
DAO
层本身中的
resultset

这意味着您正在将您的
DAO
逻辑委托给业务层,而业务层正打算这样做

商业相关的东西

如果在运行过程中出现异常,该怎么办