以前写过一篇关于DAO职责的文章,近来发现不对,我错了,在反复阅读了《阿里巴巴java开发手册》后,我重构了自己对这部分知识的认知。内容如下:
关于返回值
从dao返回的数据,要么是基本数据类型,要么是DO实体。
从service返回的数据,要么是基本数据类型,要么是DTO实体。
DAO如何工作
每个DAO应该有一个主表,围绕这个主表产生DO,同时尽量避免联表。
架构
可遵循《阿里巴巴Java开发手册》(6.1应用分层,一章)。
注意,DAO的组合复用,是在manager层做的。
一些小细节
mapper的查询条件如果使用枚举来映射数据库表中的字段,不应该在枚举中添加数据库没有的数值,比如用某个数来表示“全部”这个概念(但其实数据库中并没有一个状态值和它对应)。如果你这么做,你会发现当你需要使用集合来配合IN查询的时候,多出来的数值会成为你的麻烦。
下层为上层服务,以目标为导向。上层(业务逻辑层)需要什么,下层(数据访问层)就提供什么。而不是下层(数据访问层)有什么,上层(业务逻辑层)使用什么。
dao层不提供计算属性,只提供真实存在的属性。(虽然上层看不出来dao提供的属性是真实存在的还是计算出来的,但遵守这一点可以让你的sql与业务逻辑有效隔离。)
dao层有两个部分,一是承载实际代码的mapper.xml,一是提供接口的mapper.java。mapper.java要提供清晰明确的参数列表和返回值,禁止使用Map做参数和返回值。
任何NEP问题,都由数据使用者来保证。(你要假设任何基本数据类型外的数据都有可能为NULL,并对出现NULL的情况做出处理)