知识卡片
查找器方法归属位置由入口类型决定
内容
读取数据时可以把查询方法看作”查找器”,用find(id)、findForCustomer(customer)这类方法名把底层SQL隐藏起来。但查找器方法该放在哪里,取决于当前用的是哪种入口:如果数据库交互类是基于表的(每张表一个类实例),可以把插入、更新和查找操作都直接捆在这个类的方法里;但如果交互类是基于行的(每一行一个类实例),查找操作就不能这样绑定——用基于行的类做查找,很容易把查找写成静态方法,但这会让数据库操作变得不可替换,也就没办法在测试时用服务桩把真实数据库换掉。为了避免这个问题,最好的做法是单独创建一批”查找器对象”,每个查找器类封装若干条SQL语句对应的方法,执行查询时返回一组基于行的对象集合。使用查找器方法时还有一个容易被忽略的陷阱:查找器工作在”数据库状态”下,而不是”对象状态”下——如果查询数据库找某个俱乐部的所有成员,那些只存在于内存、还没写回数据库的新成员不会出现在结果里;要避开这个陷阱,最简单的办法是让相关的写操作先于查询完成。
参考来源
- 位置:《企业应用架构模式》第一部分"表述"之"第3章 映射到关系数据库"之"3.3 读取数据"(源文件:_epub-src/OEBPS/Text/000019.html)
- 结论依据:原文说明"在什么地方放置查找器方法是由使用的接口模式决定的。如果数据库交互类是基于表的……那么就能把插入和更新操作也捆绑在查找器方法中。如果交互类是基于数据行的……这种情况就不行了……为了避免这个问题,最好是创建独立的查找器对象……使用查找器方法时要注意的是:这些查找器方法工作在数据库状态下而不是对象状态下",直接支撑本卡结论。
- 原始内容:用基于行的类可以使查找变成静态操作,但是这样就会使数据库操作不可替代。这也就意味着不能通过服务桩在测试的时候调换数据库。为了避免这个问题,最好是创建独立的查找器对象。