DAO层可以返回JDBC结果集(Java)
我的Java项目有一个使用JavaAPI JDBC的DAO层;JDBC返回结果集以从数据库获取信息 考虑到具有层的编程范式,将ResultSet对象返回到业务层并将信息提取到其中是否正确 根据层定义,业务层负责将信息封装在域对象(bean等)中。但另一方面,它没有看到DAO组件 我附加此代码以显示我的范例: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<
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
逻辑委托给业务层,而业务层正打算这样做
商业相关的东西
如果在运行过程中出现异常,该怎么办