Как правильно спроектировать в приложении слой, отвечающий за работу с базой данных?
Почему подход, когда все операции чтения/записи производит отдельный класс DbManager, плох?
![4090a77f001b3f482f0d57e5fb60e3.png](//habrastorage.org/files/407/dfe/842/407dfe8421054949ab21b563231efc18.png)
Как сделать правильно? Соответствующие классы UserService, ArticleService и т.д., которые будут за это отвечать? Но тогда ведь всё равно нужен класс, который будет привязан к конкретной реализации (например, работающий с БД MySQL через JDBC-драйвер), разве нет?
![a2e6782c411b6144e046cff2d22ad4.png](//habrastorage.org/files/d17/24f/52a/d1724f52a67743b29f9c334853d5fdf8.png)
Какие есть плюсы и минусы в обоих решениях? Может быть, нужно делать вообще как-то иначе?
Раньше подход с первой диаграммы казался мне правильным и логичным, но в последнее время натыкаюсь на упоминания того, что так делать не следует (буквально сегодня, например,
здесь).