Separation of code has been the big advantage for me. All SQL code and configuration is in one location and the application logic uses a common data model. It also allows you to move to different back end implementations without changing application logic. Our application uses hibernate as a persistance layer in small installations and EJB CMP and Session beans for large deployments. The application business logic and views never change, it is common in both deployment scenarios. With out this abstraction we could never do this.
1) Flexibility If you need to change databases, or if you want to change how you access database(EJB/DAO) then you just change your persistence layer 2) Reusability I in big enterprise-wide solutions, you might have multiple applications going to the same central database. Having a seperate persistence layer allows you to reuse you database code 3) Division of labor You can have programmers that have database expertise work on your database layer, and programmers who have domain knowledge can code your business layer. If you muddle them all up, then either you need a programmer who has domain knowledge AND expertise in database.