表数据入口:充当数据库表访问入口的对象。一个实例处理表中所有的行。
表数据入口包含了用于访问单个表的所有SQL,如选择、插入、更新、删除等。其他代码调用它的方法来实现所有与数据库的交互。
表数据入口接口很简单,一般包括几个从数据库中获取数据的查找方法以及更新,插入和删除方法。每个方法都将输入参数映射为一个SQL调用并在数据库连接上执行该语句。由于表数据入口只用于数据读写,没有实例化成员变量,所以表数据入口是无状态的。
表数据入口从查询中返回信息,即使是一个根据ID的简单查询也会返回多个数据项。在允许返回多数据项的情况下,可以把这些项作为一个单行使用,但是 Java 只能返回一个单值,多次查询才能返回多行。
解决java返回一个单值的方式:
- 第一种不是很好方法是返回某种简单数据结构,如映射 Map。必须将数据从数据库中复制到映射中,这么做并不是最优解,因为这么做破坏了编译时检验,也不是一个显示化接口,这样对映射中的内容拼写错误时会产生错误。
- 更好地方法是采用数据传输对象。虽然需要创建另外一个对象,但是该对象可能在其他地方更好用
如果使用的是领域模型,也可以用表数据入口返回适当的领域对象。但缺点是,这样领域模型和表数据入口会产生耦合。
大多数使用表数据入口的时候,对数据库中每一张表使用一个入口。但是对非常简单的情况,可以只用一个表数据入口处理所有表的全部方法。
表数据入口是使用起来最简单的数据库接口模式,能够映射到数据库或记录类型上去。另外,它也为封装对数据源的精确访问逻辑提供了一种自然的方法。
领域模块、表模块、事务脚本,以上三种领域逻辑模式的数据入口选择问题:
- 通常表数据入口和领域模型很少一起使用,而ORM更适合领域模型,因为可以更好地分离领域模型和数据库之间的耦合。
- 表数据入口可以同表模块一起很好的使用,表数据入口可以产生一个记录集结构由表模块处理。表模块最适合且仅适合表数据入口。
- 表数据入口、行数据入口,都适用于事务脚本。两者之间的选择归结于如何处理多行数据。例如,如果我们使用表数据入口,返回的多行数据封装成了数据传输对象,此时事务脚本也使用到相同的数据传输对象,这样可以使用表数据入口;如果没有用到数据传输对象,那么行数据入口更方便。