What is the difference between the Data Mapper, Table Data Gateway (Gateway), Data Access Object (DAO) and Repository patterns?

Your example terms; DataMapper, DAO, DataTableGateway and Repository, all have a similar purpose (when I use one, I expect to get back a Customer object), but different intent/meaning and resulting implementation.

A Repository “acts like a collection, except with more elaborate querying capability” [Evans, Domain Driven Design] and may be considered as an “objects in memory facade” (Repository discussion)

A DataMapper “moves data between objects and a database while keeping them independent of each other and the mapper itself” (Fowler, PoEAA, Mapper)

A TableDataGateway is “a Gateway (object that encapsulates access to an external system or resource) to a database table. One instance handles all the rows in the table” (Fowler, PoEAA, TableDataGateway)

A DAO “separates a data resource’s client interface from its data access mechanisms / adapts a specific data resource’s access API to a generic client interface” allowing “data access mechanisms to change independently of the code that uses the data” (Sun Blueprints)

Repository seems very generic, exposing no notion of database interaction.
A DAO provides an interface enabling different underlying database implementations to be used.
A TableDataGateway is specifically a thin wrapper around a single table.
A DataMapper acts as an intermediary enabling the Model object to evolve independently of the database representation (over time).

Leave a Comment