Не повтаряйте Дао!

За по-голямата част от разработчиците пишат едни и същи код за всеки DAO в системата тя се превърна в навик. Въпреки, че човек може да нарече повторение на "замърсяване на кода", повечето от нас са се научили да живеят с него. В допълнение, има заобикаляне. Можете да използвате много ORM-средство за премахване на код повторения. Например използването на хибернация, можете просто да използвате операции сесия директно за всички свои постоянни обекти на домейни. Недостатъкът на този подход е загубата на писане.

Защо ви е необходимо от напечатан интерфейс за вашия код за достъп до данните? Бих казал, че това: тя намалява програмни грешки и увеличава производителността чрез използване на съвременни IDE-средства. На първо място, а въведе интерфейс ясно показва, която възразява на разположение постоянен домейн. На второ място, това елиминира необходимостта от податлива на грешки на задействане на устройството тип (типичен проблем за операции на заявки, отколкото за CRUD). На последно място, той поддържа автоматично завършване функция, налична в най-модерния IDE. С помощта на автоматичното завършване е бърз начин да се помни това, което иска на разположение за определен клас домейн.

В тази статия ще ви покажем как да се избегне повтарянето на DAO-код в същото време да се възползват от интерфейса въведената. Всъщност, всичко, което трябва да се напише за всеки нов DAO - е Hibernate-файл за преобразуване, традиционната Java-интерфейс и 10 реда във вашия Пролет конфигурационен файл.

изпълнение DAO

DAO модел трябва да бъде добре познат на всеки разработчик на корпоративни Java-базирани приложения. реализация на шаблона се различават съществено помежду си, но нека се изясни ситуацията в основата на изпълнението на Дао, представени в тази статия:

  • Всички достъп до базата данни в системата се извършва чрез DAO за капсулиране.
  • Всеки DAO инстанция е отговорен за един първичен обект домейн или юридическо лице. Ако обектът на домейна е със самостоятелен цикъл на живот, той трябва да има свой собствен DAO.
  • DAO е отговорен за създаване, прочетете (първичен ключ), актуализиране и изтриване (т.е. CRUD (създаване, четене, актуализиране, заличаване)) на обект домейн.
  • DAO може да позволи на заявки въз основа на критерии, различни от първичния ключ. I се отнасят до такива методи като търсач или намиране. метод търсачка, обикновено връща колекция от предмети на домейни, под ръководството на Дао.
  • DAO не се занимава с обработката на транзакции, сесии или връзки. Това се прави извън DAO да се осигури гъвкавост.

DAO родово интерфейс

Основна база DAO е дейността си боклук. Методи за общата DAO интерфейс определя следното:

Обява 1. генерализирана интерфейс DAO

Въвеждането на интерфейс

Изпълнението, показано на Обява един интерфейс хибернация тривиално (Обявата 2). Просто се обадете подходящите методи и Hibernate добавена отливката. Пролет управлява сесии и сделки. Разбира се, аз съм се предположи, че тези функции са инсталирани правилно. Тази тема е добре обсъден в Ръководство и справочник за системи на хибернация и пролет.

Обява 2. Първото изпълнение на родово DAO

конфигурация Spring

И накрая, в конфигурацията пролет, аз ще създаде екземпляр на GenericDaoHibernateImpl. Дизайнерски GenericDaoHibernateImpl трябва да се уточни за клас на домейн ще се срещне с DAO инстанция. Необходимо е да се знае, хибернация по време на работа, какъв тип обект контролира Дао. В Обява 3, аз минавам клас домейн лицето за от прилагането на пробата в дизайнер и инсталиране на предварително конфигуриран фабрика хибернация сесия като параметър за създаде екземпляр на DAO:

Обява 3. Конфигуриране на Дао

Готов родово DAO

Аз не съм направил, но това, което вече е определено може да се използва. В Обява 4, можете да видите пример за използването на генерични DAO във формата, в която той има в даден момент:

Обява 4. Използването DAO

В този момент аз имам родово DAO, може да изпълнява CRUD типизиран работа. Идеално подходящ би било да се създаде подклас на GenericDaoHibernateImpl да добавите възможности за извършване на заявки за всеки обект домейн. Въпреки това, тъй като целта на тази статия е да покаже как може да се направи без изрично Java код за всяка заявка, ще се използват два допълнителни инструменти за въвеждане на заявки към Дао, а именно, на име заявки Spring AOP и хибернация.

изпълнение Spring AOP

Можете да използвате изпълнението (въведение) през пролетта на AOP да увеличите функциите на съществуващ обект чрез въвеждане на обект в прокси обект, да се дефинират нови интерфейси трябва да изпълняват, и да предават всички предварително неподдържани методи за един процесор. По мое изпълнение, използвам изпълнение DAO да добавите няколко начина търсачка в съществуващата родово DAO-класа. Тъй като методите на търсачка са специфични за всеки обект домейн, те се прилагат към напечатани интерфейси родово DAO.

Обява 5 показва конфигурация използва пролет:

Обявата 5. Spring конфигурация FinderIntroductionAdvisor

В конфигурационния файл, показан на Обява 5, аз съм определено три пролет-компонент. Първият компонент, FinderIntroductionAdvisor, дръжки всички методи, включени в DAO и не са достъпни в GenericDaoHibernateImpl клас. След известно време, ще се обсъди подробно съветник компонент.

И накрая, третият и най-интересното компонент е инстанция на обединена GenericDaoHibernateImpl прокси, което му дава възможност да извършва намиране на методи. Това определение на компонент, твърде абстрактно и не определя интерфейс, който бих искал да се включа в декларацията си униформа DAO. Интерфейсът ще бъде различен за всеки отделен случай. Моля, имайте предвид, че пълната конфигурация, показана на Обява 5 се направи само веднъж.

Разширяване GenericDAO

за всеки DAO интерфейс, разбира се, тя се основава на GenericDao интерфейс. Просто трябва да се адаптират на интерфейса към специфичен клас домейн и да го удължи до включа методи търсачка. В Обява 6 можете да видите пример GenericDao интерфейс. удължен за конкретна задача:

Обявата 6. интерфейс PersonDao

Очевидно е, че целта на метода, определен в Обява 6, е името на човека търсене. Задължително изпълнение на Java код е напълно родово код, който не изисква никакви промени, когато добавяте допълнително DAO.

Конфигуриране PersonDao

Тъй като конфигурацията Пролет въз основа на някои по-ранни "абстрактни" компоненти, той е доста компактен. Трябва да отбележа, за клас на домейн ми DAO носи отговорност, както и уточняване на пролет, а DAO интерфейс трябва да приложи (някои методи директно, а някои - с помощта на импланти). Обява 7 показва конфигурационния файл Пролет за PersonDAO:

Обявата 7. Spring конфигурация за PersonDao

Обява 8 показва използването на актуализирана версия на Дао:

Обява 8. С помощта на интерфейса въведен

Въпреки, че кодът на Обява 8 е правилен начин да се използва въведената в интерфейса PersonDao а. изпълнение DAO не е приключило. Обадете findByName () хвърля изключение по време на изпълнение. Проблемът е, че аз все още не са приложени на заявката е необходимо да се обадите findByName (). Всичко, което остава да се направи - да се уточни на запитването. За това ли да използвам името на хибернация заявка.

Хибернация име заявки

Използването на хибернация, можете да определите HQL-заявка в файл за преобразуване на хибернация (hbm.xml) и да му дадете име. Можете да използвате тази заявка по-късно в своя Java-код, просто се позовава на това име. Едно от предимствата на този подход е възможността за редактиране на заявки със разгръщане без да се променя изходния код. Както ще видите по-късно, друго предимство е възможността за прилагането на "пълно" Дао без да пишете ново изпълнение на Java-кода. Обява 9 показва пример за даден файл картографиране с име заявка:

Обява 9. хибернация картографиране файл с име на заявката

Обявата 9 дефинира картографирането заспиване на клас домейн-Лице с две свойства: име и тегло. Лице - е прост POJO с посочените свойства. Файлът съдържа и заявка, която намира всички случаи на лице в базата данни, чието име имот е определен параметър. Hibernate не осигурява реално пространство от имена функционалност за посочените заявки. За целите на тази дискусия, аз използвам префикс в имената на всички искания под формата на кратко (не изцяло) име на класа на домейн. В една реална ситуация, може би по-добра идея е да се използва пълното име на класа, включително името на пакета.

Стъпка по стъпка преглед

Виждате ли всички стъпки, които трябва да се извършват в процеса на създаването и конфигурирането на нова DAO за всеки обект домейн. Тези три прости стъпки са:

  1. Определяне на интерфейс, който се простира GenericDao и съдържа всичко, което трябва методи търсачка.
  2. Добавете име на заявката за всеки метод търсачка в hbm.xml файл за преобразуване за всеки обект домейн.
  3. Добавяне на 10-лайн Пролет конфигурационен файл за DAO.

Стигам до извода, на дискусия разглеждане на кода (записва само веднъж!), Която изпълнява моите методи за търсене.

Многократна употреба DAO класа

Пролет-използвани методи съветник и прехващачи са тривиални и тяхната работа е всъщност в обращение обратно към GenericDaoHibernateImplClass. Всички разговори, името на метода, който започва с находка, се прехвърлят на DAO и (методът един executeFinder).

Обява 10. Изпълнение FinderIntroductionAdvisor

executeFinder () метод

Единственият метод, който липсва в показано в Пример 10, прилагането е метод executeFinder (). Този код изглежда за титлата и се обадете на метода на класа, и ги сравнява с името на хибернация-заявка с конфигурацията на споразумението. Можете да използвате и FinderNamingStrategy да позволи други начини за именуване запитвания. изпълнението по подразбиране търси искане с ClassName.methodName за името. където име на класа - това е кратко име, без опаковки. Обява 11 показва изпълнението на завършването на моя написали родово DAO:

Обявата 11. executeFinder изпълнение ()

В заключение

Преди Java 5 език не подкрепят писмено код, които ще бъдат обобщени, така и написан; трябваше да избере една от следните две неща. В тази статия, вие сте виждали само един пример за използване на Java 5 клас шаблони (генерични продукти) в комбинация с инструменти като пролетта и Hibernate (и AOP), за да се подобри производителността. Generic DAO типизиран клас е относително лесно да се напише. Всичко, което трябва - един общ интерфейс, няколко имена заявки и допълнение 10-лайн до файла Пролет конфигурация. В резултат на това, вие значително ще се намали вероятността от грешки и да спести време.

Почти всички от сорс кода, показан на тази статия, е за многократна употреба. Докато си DAO класове могат да съдържат типове заявки или операции не изпълнява тук (например, операции на групи), трябва да бъде в състояние да изпълни поне някои от тях, като се използват техники, демонстрирани от мен. За да разгледате други реализации генерализирани напечатан DAO класа, се отнасят до "ресурси".

благодаря