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
对象, resultset
等DAO
层内的所有DB
相关逻辑
那么处理DAO
层内部并关闭所有这些打开的connection
和DAO
层本身内的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