- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个包含以下 java 文件的应用程序:
服务:
AccountService.java
UserService.java
MessageService.java
DAO:
AccountDAO.java
UserDAO.java
MessageDAO.java
表格:
ACCOUNTS
USERS
MESSAGES
在 MessageService.java
中,我有一个函数 newMessage()
必须从所有 3 个表中查询数据。
(1)按照Spring的解耦标准,应该这样调用:
AccountDAO.java -- ACCOUNTS
/
MessageService.java -- MessageDAO.java -- MESSAGES
\
UserDAO.java -- USERS
但问题是,这种方法进行了 3 次数据库调用。
(2) 为了获得更好的性能,我会这样做:
MessageService.java -- MessageDAO.java -- Join ACCOUNTS, MESSAGES and USERS
但通过这种方式,它是紧密耦合的,如果 USERS 表发生变化,我也必须更改 MessageDAO.java(以及我拥有的所有其他使用 USERS 表的 DAO)。这真的很糟糕,因为(在非假设中)我们有很多 DAO
哪种方法被认为是更好的做法?还是我缺少另一种方法?
最佳答案
According to Spring's decoupling standards, this is how the calls should be made
这是错误的。 Spring 没有“解耦标准”。请在 Spring 文档中找到我的引用资料,告诉您必须如何构建持久层代码。
通常,您的应用程序要操作的每个“实体”都有一个 DAO,但将这种模式极端化以解构将多个表连接成三个不同查询的查询是愚蠢的。
如果您需要一个 newMessage()
方法在查询中将一些表连接在一起,请选择最有意义的 DAO - 可能是 MessageDAO
和以有意义的方式编写查询/方法。
但是没有规定必须对每个实体进行不同的查询,并且不允许一个 DAO 类进行涉及其他实体表的查询。这太极端了,没有任何好处。
另一方面,如果您担心具有多个数据层类的可维护性,这些类可以识别您的所有表,那么请研究 parsifal 提到的 ORM 解决方案以减轻一些这项工作。
关于java - Spring——解耦与性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12827003/
我是一名优秀的程序员,十分优秀!