What is the difference between DAO and Repository Patterns
In this blog, we are going to learn about the difference between the DAO and Repository Patterns.
- It is a repository of a specific type of objects - it allows you to search for a specific type of objects as well as store them. Usually it will ONLY handle one type of objects. E.g. AppleRepository would allow you to do AppleRepository.findAll(criteria) or AppleRepository.save(juicyApple). Note that the Repository is using Domain Model terms (not DB terms - nothing related to how data is persisted anywhere).
- A repository will most likely store all data in the same table, whereas the pattern doesn’t require that. The fact that it only handles one type of data though, makes it logically connected to one main table (if used for DB persistence).
- A DAO is a class that locates data for you (it is mostly a finder, but it’s commonly used to also store the data). The pattern doesn’t restrict you to store data of the same type, thus you can easily have a DAO that locates/stores related objects.
E.g. you can easily have UserDao that exposes methods like
Collection<Permission> findPermissionsForUser(String userId) User findUser(String userId) Collection<User> findUsersForPermission(Permission permission)
All those are related to User (and security) and can be specified under then same DAO. This is not the case for Repository.
Note: that both patterns really mean the same (they store data and they abstract the access to it and they are both expressed closer to the domain model and hardly contain any DB reference), but the way they are used can be slightly different, DAO being a bit more flexible/generic, while Repository is a bit more specific and restrictive to a type only.