Форум программистов, компьютерный форум, киберфорум
Java: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/64: Рейтинг темы: голосов - 64, средняя оценка - 4.56
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
1

Ещё раз о DAO и правильной клиент-серверной архитектуре

20.04.2013, 18:39. Показов 13089. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот что-то не клеется у меня с этой "каноничной архитектурой" и всё
Пожалуйста объясните на моём упрощённом примере как же оно всё таки должно быть, меня интересует именно серверная часть.

Допустим есть бд и в ней есть таблицы:
Department{int ID_Department, String AddressDepartment} - подразделение, содержит id и адрес где оно находится
Employee {int ID_Person, int ID_Department String FIO} -рабочий, содержит фио рабочего, его id и id подразделения где он работает
ContactInfo(int ID_ContactInfo, ID_Person(Owner info), String info} -контактная информация, содержит id конт. инф-ции, id рабочего которому она пренадлежит и собственно саму строковую информацию.

Получается по классической схеме
1)Я должен отразить эти таблицы в сущности на сервере:
EmployeeServer, DepartmentServer, ContactInfoServer
и также создать классы, объектами которых я собираюсь общаться с клиентом и которые я и отдам клиенту:
EmployeeTransfer, DepartmentTransfer, ContactInfoTransfer.

Дальше при запросах клиента, допустим на то чтобы получить все записи о работниках я на сервере должен из уровня Service обратиться к уровню DAO, получить оттудова список объектов EmployeeServer, преобразовать их на уровне Service в список EmployeeTransfer и отдать клиенту.

Вопрос: как должны выглядеть уровень DAO и уровень сервиса? Вот например чем должен заниматься уровень DAO в реальных системах, в книгах постоянно упрощённые какие-то схемы и нифига нет того что реально можно применить. DAO уровень это один какой-то класс который умеет отдавать все записи и Employee и Department и ContactInfo или же это куча классов типа EmployeeDAO, DepartmentDAO, ContactInfoDAO которые отвечают за получение данных каждый из определённой таблици ну или как-то по другому?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2013, 18:39
Ответы с готовыми решениями:

Тощий клиент? для оснащения рабочих мест клиент-серверной БД Аксесс 2003
Форумчане,доброго времени суток! Прорабатываю вопрос о затратах для оснащения рабочих мест (не...

Создание клиент-серверной БД в Access
Здравствуйте! Можно или нельзя создать клиент-серверную БД в Access c помощью Delphi?

BSOD при авторизации в клиент-серверной программе
В общем есть у меня написанная мной программа. Клиент-серверная, так вот, на всех компьютерах с...

Реализация связи WCF в Клиент/серверной винформе
Всем здравствуйте! Первый раз пишу на форуме и поэтому прошу прощение за свою неграмотность и...

13
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
20.04.2013, 21:18 2
по дао очень хорошо и наглядно https://netbeans.org/kb/docs/j... model.html

а вообще екомерс вполне себе такое скелетное приложение https://netbeans.org/kb/trails/java-ee.html для понимания
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
20.04.2013, 23:16  [ТС] 3
mutagen, спасибо, посмотрю завтра ещё этот вариант. До этого то что я находил всегда было чисто для демонстрации, но явно не в виде "взрослой энетерпрайз реализации", может хотя бы с этим примером пойму как же мне сделать не только чтобы всё работало, а ещё и чтобы тот кто будет проверять сразу понял как оно работает увидев знакомую архитектуру.
0
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
28.04.2013, 14:03  [ТС] 4
Пришли майские праздники (ну почти) и наконецто снова появилось время закончить свой мини проект.

Цитата Сообщение от mutagen Посмотреть сообщение
по дао очень хорошо и наглядно https://netbeans.org/kb/docs/j... model.html
А где там DAO ? Там просто как спроектировать базу и как получить sql код. О java и mvc там ни слова, а база то у меня давно уже есть, мне нужен хороший правильный пример именно как создавать уровни сервисов и dao для существующей базы ...
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
28.04.2013, 20:51 5
а причём MVC к DAO? уровни сервисов? что это?
в примере есть всё что нужно ЕЕ приложению, подробнее разжёвывать - это писать вам проект
читайте книги, сходите на курсы
не ждёте же вы от форума выполнения задачи по полному обучению?
1
31 / 31 / 10
Регистрация: 01.03.2013
Сообщений: 61
29.04.2013, 04:36 6
Цитата Сообщение от Gepar Посмотреть сообщение
Пришли майские праздники (ну почти) и наконецто снова появилось время закончить свой мини проект.


А где там DAO ? Там просто как спроектировать базу и как получить sql код. О java и mvc там ни слова, а база то у меня давно уже есть, мне нужен хороший правильный пример именно как создавать уровни сервисов и dao для существующей базы ...
DAO модуль предназначен для того, чтобы получать/записывать/изменять данные в таблице. Модуль Service должен обеспечивать построение соответствующего View для клиента на основе полученных данных из DAO и дополнительных параметров запроса, чтобы потом вернуть View через контроллер на сторону клиента.
Например, Ваше веб-приложение предоставляет клиенту возможность поиска футболистов по трем критериям: по возрасту, имени, национальности. Следовательно, в DAO модуле есть примерно такой класс:
Java
1
2
3
4
5
public class FootballersDAO{
    public getByName(String name){...}
    public getByAge(Integer age){...}
    public getByCountry(String country){...}
}
DAO-модуль должен заниматься только работой с базой: получением и записью данных(ORM-представлений объектов системы).
Service-модуль обеспечивает получение необходимых данных, критерий поиска которых приходит с контроллера от клиента, либо же запись новых, вызывая соответствующие методы классов из DAO модуля. А также service занимается последующей обработкой данных для возвращения клиенту. Например, пользователь хочет получить список всех футболистов, возраст которых не больше 25 лет. Клиент отправляет запрос(POST, GET) на наш сервер на соответствующий URL, в котором прописана верхняя рамка возраста. Дальше контроллер, который обеспечивает обработку всех запросов на этом урле получает параметры запроса и вызывает сервис, который отвечает за поиск футболистов. Сервис в свою очередь вызывает соответствующий DAO, которому передает параметр границы возраста. В DAO происходит поиск в таблице БД, и отправка результата обратно на сервис, где происходит обработка полученного списка игроков(например, сортировка по имени или запись в лог полученных результатов, или формирование view, или....короче, Вы поняли) и последующая обратная передача контроллеру и на клиентскую сторону.
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
29.04.2013, 23:41  [ТС] 7
Цитата Сообщение от mutagen Посмотреть сообщение
в примере есть всё что нужно ЕЕ приложению
Там проектирование базы, это у меня давно есть (и вообще я не понял каким боком оно к ee относится), меня же интересует как это в java всё представить.

Цитата Сообщение от mutagen Посмотреть сообщение
читайте книги
Читаю, нигде нет ничего готового, вот сейчас читаю хвалёную книгу по JPA - "Pro JPA 2 Mastering the Java Persistence API" и толку, да я узнал много нового по JPA и его аннотациях и принципах, но я узнал 1000 и 1 способ как вытянуть сущность из базы, но не какая архитектура может быть на сервере который тягает эти сущности и передаёт их пользователю. В книгах больше описываеться как сделать что-то для себя, а не как сделать полноценное приложение.

Цитата Сообщение от mutagen Посмотреть сообщение
сходите на курсы
Мой проект какраз и является заданием полученным на курсах, лол. Не пошёл бы на курсы - не мучился бы с java вообще

Цитата Сообщение от mutagen Посмотреть сообщение
не ждёте же вы от форума выполнения задачи по полному обучению?
Нет, но я уже месяц бьюсь как рыба об лёд и хочу хоть где-то получить классическое клиент-сервеное приложение которое отражает базу данных в сущности, где есть уровень dao и сервисов и которое покажет хоть на каком-то примере как же на сервере из полученных сущностей сделать что-то для пользователя и на каких уровнях это принято делать. Мне на курсах толочат "надо уровень dao, надо уровень сервисов", а фиг пойми что куда пихать и что где должно происходить, ни одного примера же нету, замучился я
Итого соообщение получилось в стиле "наболело".



Цитата Сообщение от blackhard27 Посмотреть сообщение
DAO модуль предназначен для того, чтобы получать/записывать/изменять данные в таблице.
Он один или их несколько? Я не могу найти ни одного человека в реальной жизни/здесь на форуме чтобы мне ответил на этот вопрос. Вот есть у меня таблица Контактные данные, есть таблица Персона, отразил я их в сущности (entity), теперь пишу классы DAO которые будут тягать из базы эти сущности, мне писать PersonDAO, ContactInfoDAO ... в пакету DAO или мне написать один PersonContactInfoSomethingOtherPlusCanMakeCoffeDAO которые делает это всё сам (у меня есть догадки о правильном варианте, но как всё же обычно делают) ?


Цитата Сообщение от blackhard27 Посмотреть сообщение
Модуль Service должен обеспечивать построение соответствующего View для клиента на основе полученных данных из DAO и дополнительных параметров запроса, чтобы потом вернуть View через контроллер на сторону клиента.
Тоесть View для клиента это те объекты, которые я должен буду передать ему?Здесь аналогичный вопрос: класс-сервис один коорый всё умеет или n штук (по одному на сущность, а точнее на, как вы выразились, View для пользователя) ? Те получается на уровне сервиса я буду теребить свой класс из пакета DAO (который в свою очередь будет дёргать entityManager и доставать через него сущность), который отдаст мне сущность в чистом виде, допустим это будет PersonEntity и дальше класс из service будет преобразовывать (копировать) данные из PersonEntity в PersonView, которая предназначена для клиента, так ? Или я опять что-то недопонимаю.

Но тогда я не понял зачем контроллер ... я так понимаю что когда у меня клиент-сервер то клиент будет иметь интерфейс представляющий список методов сервиса и он будет соединяться с сервером и дёргать методы из этого интерфейса (а точнее интерфейсов так как сервисов много будет), те получается клиент будет сходу дёргать service уровень, а зачем мне контроллер я не понял пока, или у меня контроллер это spring который пересылает запросы/ответы и парсит их из xml туда-сюда, а также должен будет обеспечить авторизацию пользователя прежде чем он начнёт работу(блин, так и не разобрался как прикрутить это spring-security в свой клиент-сервер)?
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
30.04.2013, 00:06 8
давайте пойдём от mvc патерна
в 1 очередь это патерн, но не жёсткое руководство, его задача упростить отдельные блоки и изолировать их логику работы, для уменьшения ошибок и упрощения разработки
model - это база данных и её ORM + service уровень который имплементирует CRUD операци с помощью ORM на основе критериев переданных из контроллера, это всё.
controller - бизнес логика приложения, внутри этого уровня реализованы все логические операции с данеными + валидация данных (иногда там же уведомление view о изменении модели)
иногда валидацию выносят в отдельный уровень (промежуточный между контроллером и view, такой себе интерцептор на aop в случае спринга)
view - имплементация отображения данных возвращаемых методами контроллера, это может быть как свинг приложение, так и веб cms, так и мобильное приложение на андроиде или iOS

в том примере что я вам дал всё это есть, просто там эти уровни слегка переплетаются

напомню ещё раз о каком примере речь (возникло подозрение что мы говорим о разных вещах)
https://netbeans.org/kb/trails/java-ee.html
Tutorials and Articles
NetBeans E-commerce Tutorial

там по шагам всё что нужно EE приложению :

Не по теме:

Introduction
Designing the Application
Setting up the Development Environment
Designing the Data Model
Preparing the Page Views and Controller Servlet
Connecting the Application to the Database
Adding Entity Classes and Session Beans
Managing Sessions
Integrating Transactional Business Logic
Adding Language Support
Securing the Application
Testing and Profiling
Conclusion


в жизни тоже сложно добиться полной изоляции, поэтому не ищите классического красивого реального приложения, а просто к нему стремитесь. всё равно после пары тройки модификаций всё начинает расползаться и требует рефакторинга и редизайна
0
31 / 31 / 10
Регистрация: 01.03.2013
Сообщений: 61
30.04.2013, 02:46 9
Цитата Сообщение от Gepar Посмотреть сообщение
Он один или их несколько? Я не могу найти ни одного человека в реальной жизни/здесь на форуме чтобы мне ответил на этот вопрос. Вот есть у меня таблица Контактные данные, есть таблица Персона, отразил я их в сущности (entity), теперь пишу классы DAO которые будут тягать из базы эти сущности, мне писать PersonDAO, ContactInfoDAO ... в пакету DAO или мне написать один PersonContactInfoSomethingOtherPlusCanMakeCoffeDAO которые делает это всё сам (у меня есть догадки о правильном варианте, но как всё же обычно делают) ?
Давайте попробуем упростить наше строгое представление. В общем смысле, каждое приложение - это набор папок, каждая из которых содержит что-то уникальное, которое может пересекаться с другими папками содержимым, но в идеале этого не делает. Например, Вы же создаете у себя на компьютере папки с названиями "Фильмы", "Музыка" или "Картинки", в которые кладете разные по типу, но пересекающиеся по содержанию данные: музыка - это звук, картинки - это визуальные данные, фильмы - данные, которые получены совмещением первых со вторым.
Так и приложение: если есть классы, которые выполняют схожие действия, то есть находятся на одном уровне архитектуры программы, то их необходимо содержать в одном месте, чтобы было логичное построение скелета Вашего приложения.
PersonContactInfoSomethingOtherPlusCanMakeCoffeDAO - это, конечно, очень здорово, и даже многофункционально, но это уже относится к плохому стилю программирования Давайте лучше расскажу, как делаю я: если у меня есть entity Person и она записывается/извлекается из БД, то я делаю для него PersonDAO, который кладу в DAO-модуль. Пытайтесь разбить Ваши данные и их обработку на более мелкие блоки, предназначение и функциональность которых можно перечислить по их названию. Советую почитать книгу Роберта Мартина "Чистый код" для более лучшего понимания проектирования java-приложений(да и не только).
Вы должны четко понимать, что Вы конкретно хотите сделать. Представьте, что Вас спросят для чего предназначен этот класс, и что Вы скажете в ответ? "Ну, этот класс умеет записывать данные об известных вегетарианцах, получает данные о текущей температуре и занимается проверкой идентификации пользователей нашего сайта..." Правда, звучит не очень хорошо?
Прежде, чем садиться за код, постарайтесь описать на бумаге или словами Вашу идею, каркас приложения(а лучше всего с использованием UML). Если не будет получаться просто, то возможно, лучше обдумать структуру еще раз.

Цитата Сообщение от Gepar Посмотреть сообщение
Тоесть View для клиента это те объекты, которые я должен буду передать ему?Здесь аналогичный вопрос: класс-сервис один коорый всё умеет или n штук (по одному на сущность, а точнее на, как вы выразились, View для пользователя) ? Те получается на уровне сервиса я буду теребить свой класс из пакета DAO (который в свою очередь будет дёргать entityManager и доставать через него сущность), который отдаст мне сущность в чистом виде, допустим это будет PersonEntity и дальше класс из service будет преобразовывать (копировать) данные из PersonEntity в PersonView, которая предназначена для клиента, так ? Или я опять что-то недопонимаю.

Но тогда я не понял зачем контроллер ... я так понимаю что когда у меня клиент-сервер то клиент будет иметь интерфейс представляющий список методов сервиса и он будет соединяться с сервером и дёргать методы из этого интерфейса (а точнее интерфейсов так как сервисов много будет), те получается клиент будет сходу дёргать service уровень, а зачем мне контроллер я не понял пока, или у меня контроллер это spring который пересылает запросы/ответы и парсит их из xml туда-сюда, а также должен будет обеспечить авторизацию пользователя прежде чем он начнёт работу(блин, так и не разобрался как прикрутить это spring-security в свой клиент-сервер)?
Прочитав это, я вспомнил себя годичной давности, когда проходил летнюю стажировку в одной из IT-фирм, во время которой захотели меня быстро всему обучить: Spring Framework, Maven, JAXB, Hibernate и т.д. Тогда и у меня было недопонимание во всем, что творилось
Вам необходимо для начала сесть и хорошенько разобраться с MVC-паттерном и уяснить одну простую вещь: идеального примера нет и все Ваши старания будут увенчаны только после того, как Вы создадите 4-5 приложений и "прочувствуете" идею Model-View-Controller.
Начнем по-порядку:
1) View. Считайте на первых этапах, что View - это просто набор данных, который необходимо передать клиенту, дабы обслужить его священные запросы. Классы, которые умеют все - это просто набор буковок, которые работают до первого эксепшна, поэтому не делайте такие классы, иначе на страшном суде у Вас будет очень долгий досмотр.
Что такое entityManager? Не нужно нам ничего подобного. Как работаем мы? По упрощенной донельзя схеме:
Например, я хочу узнать адрес Маши, который хранится в веб-справочнике(наше приложение). Что я делаю, как юзер? Я захожу на страничку сайта, ввожу данные: имя - Маша, фамилия - Кулакова. И нажимаю кнопочку "Найти" - все просто.
Теперь рассмотрим, что происходит на сервере: когда мы нажали кнопку, то сработал на UI скрипт, который отправил нам на сервер данные на URL /searchaddress в виде...ммм...в виде JSON:
Java
1
2
3
4
{
   'FirstName': 'Маша',
   'LastName': 'Кулакова'
}
Что происходит дальше: класс-контроллер, который "прослушивает", т.е. принимает все запросы, которые были отправлены по урлу /searchaddress принимает JSON. Дальше контроллер вызывает сервис, например, SearchAddressUserService c параметрами (FirstName, LastName)(правильнее будет сказать метод сервиса), который уже в свою очередь вызывает PersonDAO для получения такого человека из БД. В PersonDAO вызывается метод getPersonByFullName(FirstName, LastName), который возвращает нам Person из БД(данные в базе не дублируются, т.е. поиск однозначен) либо же null.
Что происходит дальше в сервисе: мы получили Person с полной информацией(имя, фамилия, год рождения, адрес, зарплата, количество браков по любви и расчету и т.д.), но нам необходим только адрес, что мы в свою очередб с успехом делаем, извлекая адрес из Person(не забудьте проверку на null только!), создаем JSON:
Java
1
2
3
{
  'Address':'some_data_address_string'
}
и передаем его обратно на контроллер, который отсылает обратно клиенту эти данные, чтобы тот знал, под каким окном серенады петь.

2) Список методов сервиса?..Хм..Вы, случайно, не затронули SOAP и REST сервисы? Если так, то Вы слишком углубились для "простого каркаса приложения"
1
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
30.04.2013, 11:04 10
Цитата Сообщение от blackhard27 Посмотреть сообщение
поэтому не делайте такие классы, иначе на страшном суде у Вас будет очень долгий досмотр.
Эта фраза мне напоминает одного из наших форумчан

Зря Вы упомянули про фаулера, если бы он прочитал ваш пост, он бы записал вам +1 для страшного суда.
если вы так делаете ПО как объясняете, то Фаулера вы не поняли

вы начали по порядку 1 вью, а где остальное в вашем "порядке"?
1
31 / 31 / 10
Регистрация: 01.03.2013
Сообщений: 61
30.04.2013, 14:46 11
Цитата Сообщение от mutagen Посмотреть сообщение
Эта фраза мне напоминает одного из наших форумчан

Зря Вы упомянули про фаулера, если бы он прочитал ваш пост, он бы записал вам +1 для страшного суда.
если вы так делаете ПО как объясняете, то Фаулера вы не поняли

вы начали по порядку 1 вью, а где остальное в вашем "порядке"?
Вообще-то я упомянул Роберта Мартина и его книгу "Чистый код", а не Мартина Фаулера и его "Рефакторинг. Улучшение существующего кода"(эта книга тоже неплоха), поэтому это Вы не поняли меня

А объясняю я так, как позволяет мой небольшой опыт в IT для своего студенческого возраста. Главное, что я не накидываю кучу ссылок человеку, который не может разобраться в чем-то. А Google у всех есть, он такой
1
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
30.04.2013, 16:45 12
хорошо что вы заметили мои пассажи про "Роберта-Мартина-Фаулера" это уже полдела

теперь осталось дать достойный ответ на последний выделенный вами кусочек из моего поста
Цитата Сообщение от mutagen Посмотреть сообщение
вы начали по порядку 1 вью, а где остальное в вашем "порядке"?
он то и является главной фишкой, а не прикол про Мартина
1
653 / 402 / 35
Регистрация: 19.02.2013
Сообщений: 1,072
Записей в блоге: 2
30.04.2013, 17:24 13
Цитата Сообщение от mutagen Посмотреть сообщение
Эта фраза мне напоминает одного из наших форумчан

Не по теме:

если речь обо мне - я посылаю сразу в специально заготовленные локации преисподней

1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
01.05.2013, 18:51  [ТС] 14
Цитата Сообщение от blackhard27 Посмотреть сообщение
во время которой захотели меня быстро всему обучить: Spring Framework, Maven, JAXB, Hibernate и т.д.
ну блин, это просто таки мои курсы, только у меня список: проектирование, администрирование бд, java, java ee (spring, maven, ant, jaxp), java web (jsp) и html.

Цитата Сообщение от blackhard27 Посмотреть сообщение
Что происходит дальше: класс-контроллер, который "прослушивает", т.е. принимает все запросы, которые были отправлены по урлу /searchaddress принимает JSON. Дальше контроллер вызывает сервис
Цитата Сообщение от blackhard27 Посмотреть сообщение
...создаем JSON:
Значит я таки правильно понимаю что контроллер у меня spring так как именно он у меня сам парсит всё в xml/ json / как ему нравиться и распарсивает всё назад на другой стороне.

Ну ок, спасибо за объяснения, тогда займусь завтра великим и страшным рефакторингом и разобъю свой сервис на сервис и дао (у меня сейчас один уровень делаёт всё и сразу), заодно может втулю в базу и в сущность поле version чтобы не придрались насчёт конкурирующих запросов.
0
01.05.2013, 18:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2013, 18:51
Помогаю со студенческими работами здесь

программист для написание клиент-серверной программы
Здравствуйте. Нужен программист для написание клиент-серверной программы на C++ в среде QT под Linux

Правильная организация клиент-серверной программы с БД на сервере/ах
Приветствую всех, уважаемые форумчане! Имеется программа, состоящая из серверной и клиентской...

Организовать взаимодействие четырех игроков в клиент-серверной игре
Есть клиент, есть сервер. В клиенте есть игра, смысл которой заключается в том, чтобы накопить...

Нужен надежный компонент для клиент-серверной программы
Доброго времени, уважаемые! Пишу программу, от которой требуется быть очень надежным чатом. То...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru