Nu repeta dao!

Pentru majoritatea dezvoltatorilor de scris același cod pentru fiecare DAO în sistem a devenit un obicei. Deși s-ar putea numi o repetare a „poluare a codului“, cele mai multe dintre noi au învățat să trăiască cu ea. În plus, există soluții. Puteți utiliza mai multe ORM-mijloace pentru îndepărtarea repetări de cod. De exemplu, folosind Hibernate, puteți utiliza pur și simplu operațiunile de sesiune direct pentru toate obiectele de domeniu persistente. Dezavantajul acestei abordări este pierderea de tastare.

De ce aveți nevoie de o interfață dactilografiat pentru codul dvs. pentru a accesa datele? Aș spune acest lucru: reduce erorile de programare și crește productivitatea prin utilizarea moderne IDE mijloace. În primul rând, o interfață tastat indică în mod clar care obiectele disponibile domeniu persistente. În al doilea rând, se elimină necesitatea de acționări predispuse la erori de tip (o problemă tipică pentru operațiunile de interogare decât pentru CRUD). În cele din urmă, acesta acceptă funcția de completare automată, disponibile în IDE cel mai modern. Folosind completarea automată este o modalitate rapidă de a aminti ceea ce cere disponibile pentru o clasă de domeniu specific.

În acest articol vă voi arăta cum să evite repetarea DAO-cod, în același timp, profitând de interfața tastată. De fapt, tot ce trebuie să scrie pentru fiecare nou DAO - este fișierul Hibernate-cartografiere, tradiționale Java-interfață și 10 linii în fișierul de configurare de primăvară.

punerea în aplicare DAO

modelul DAO ar trebui să fie bine cunoscut pentru orice dezvoltator de aplicații bazate pe Java corporative. șablon de realizare sunt semnificativ diferite între ele, dar să clarifice situația care stă la baza punerii în aplicare a DAO, prezentate în acest articol:

  • Toate accesul la baza de date în sistem se face printr-un DAO pentru a îngloba.
  • Fiecare instanță DAO este responsabil pentru un obiect de domeniu principal sau entitate. În cazul în care obiectul de domeniu are un ciclu de viață independentă, acesta ar trebui să aibă propriul DAO.
  • DAO este responsabil pentru a crea, citi (cheia primară), actualizați și ștergeți (de exemplu, CRUD (crea, citi, actualiza, șterge)) a unui obiect de domeniu.
  • DAO poate permite interogări pe baza altor decât cheia primară criterii. Mă refer la metode, cum ar fi un vizor sau finders. Metoda de căutare returnează de obicei o colecție de obiecte de domeniu, sub responsabilitatea DAO.
  • DAO nu este angajată în procesarea tranzacțiilor, sesiuni sau conexiuni. Acest lucru se face în afara DAO pentru a oferi flexibilitate.

DAO interfață generică

bază generalizată DAO este operațiunile sale CRUD. Metodele pentru interfața DAO Generalizat definește următoarele:

Listarea 1. DAO interfață generalizată

Implementarea unei interfețe

Implementarea prezentată în Listarea 1 interfață Hibernate triviale (Listing 2). Pur si simplu apel metodele adecvate și turnării Hibernate adăugată. Spring gestionează sesiuni și tranzacții. Desigur, eu sunt presupunând că aceste funcții sunt instalate corect. Acest subiect este bine discutat în Ghidul și sisteme de referință Hibernate și primăvară.

Listarea 2. Prima implementare a DAO generice

configurarea de primăvară

În cele din urmă, în configurația de primăvară, am crea o instanță a GenericDaoHibernateImpl. GenericDaoHibernateImpl Designer trebuie să specificați pentru o clasă de domeniu se va întâlni DAO instanță. Este necesar să se cunoască Hibernate în timpul rulării, ce tip de obiect controlează DAO. În Listarea 3, eu trec clasa Person domeniu din aplicația eșantion în Designer și instalați o fabrică de pre-configurate Hibernate-sesiune ca parametru pentru instanța creată de DAO:

Listarea 3. Configurarea DAO

DAO generic Gata

Nu am terminat, dar ceea ce a definit deja poate fi utilizat. În Listarea 4, puteți vedea un exemplu de utilizare a DAO generice în forma în care acesta are la un moment dat:

Listarea 4. Utilizarea DAO

În acest moment am un DAO generic, capabil de a efectua operațiuni CRUD-tastat. Perfect adecvat ar fi de a crea o subclasă de GenericDaoHibernateImpl pentru a adăuga capacități de a efectua cereri pentru fiecare obiect de domeniu. Cu toate acestea, din moment ce scopul acestui articol este de a demonstra modul în care se poate face fără consimțământul explicit Java-cod pentru fiecare cerere, voi folosi două instrumente suplimentare pentru introducerea de solicitări către DAO, și anume, interogări numit de primăvară AOP și Hibernare.

punerea în aplicare de primăvară AOP

Puteți utiliza punerea în aplicare (introducerile) în primăvară AOP pentru a adăuga funcționalitate la un obiect existent prin introducerea unui obiect într-un obiect proxy, pentru a defini noi interfețe trebuie să pună în aplicare, și care trece toate metodele care nu sunt acceptate anterior la un singur procesor. În punerea în aplicare a mea, am folosi implementarea DAO pentru a adăuga mai multe metode Finder în generic DAO-clasa existente. Deoarece metodele Finder sunt specifice fiecărui obiect de domeniu, acestea se aplică interfețelor tastate DAO generice.

Listarea 5 arată configurația utilizată de primăvară:

Listarea 5. Spring Configurarea FinderIntroductionAdvisor

În fișierul de configurare, se arată în Listing 5, am definit trei primăvară componente. Prima componentă, FinderIntroductionAdvisor, se ocupă de toate metodele incluse în DAO și nu sunt disponibile în clasa GenericDaoHibernateImpl. După ceva timp, voi discuta în detaliu componenta Advisor.

În cele din urmă, a treia și cea mai interesantă componentă este o instanță a unui proxy GenericDaoHibernateImpl unificat, oferindu-i posibilitatea de a efectua Finder metode. Această definiție a unei componente, prea abstractă și nu specifică o interfață pe care aș dori să pună în DAO mea uniformă. Interfața va fi diferită pentru fiecare instanță. Vă rugăm să rețineți că configurația completă prezentată în Listarea 5 se face o singură dată.

Extinderea GenericDAO

pentru fiecare interfață DAO, desigur, aceasta se bazează pe interfața GenericDao. Trebuie doar să se adapteze interfața la o clasă de domeniu specific și să o extindă la metodele mele căutare. În Listarea 6, puteți vedea o interfață de exemplu GenericDao. prelungit pentru o anumită sarcină:

Listarea 6. Interfață PersonDao

Evident, scopul metodei definite în Listarea 6, este numele persoanei de căutare. Necesar implementarea Java-cod este complet cod generic care nu necesită modificări atunci când adăugați DAO suplimentare.

Configurarea PersonDao

Deoarece configurația de primăvară bazată pe anumite componente anterioare „abstracte“, este destul de compact. Ar trebui să subliniez pentru o clasă de domeniu DAO meu este responsabil, precum și să specifice de primăvară, o interfață DAO ar trebui să pună în aplicare (unele metode în mod direct, iar unele - cu ajutorul implanturilor). Listarea 7 arată fișierul de configurare de primăvară pentru PersonDAO:

Listarea de configurare 7. Primăvara PersonDao

Listarea 8 prezintă utilizarea unei versiuni actualizate a DAO:

Listarea 8. Utilizarea interfeței dactilografiat

Deși codul din Listarea 8 este un mod corect de a utiliza o interfață PersonDao tastată. punerea în aplicare DAO nu este finalizată. Call findByName () aruncă o excepție în timpul rulării. Problema este că nu am pus în aplicare încă interogarea necesară pentru a apela findByName (). Tot ce a mai rămas de făcut - pentru a specifica interogarea. Pentru aceasta am folosi o Hibernate interogare pe nume.

Hibernate interogări numite

Utilizarea Hibernate, puteți defini HQL-interogare în fișierul de mapare Hibernate (hbm.xml) și dau un nume. Puteți utiliza această interogare mai târziu în Java-cod, pur și simplu, referindu-se la numele dat. Un avantaj al acestei abordări este abilitatea de a edita interogări de implementare fără a schimba codul sursă. După cum veți vedea mai târziu, un alt avantaj este capacitatea de a pune în aplicare un „complet“ DAO fără a scrie punerea în aplicare nouă a Java cod. Listarea 9 prezintă un exemplu de un fișier de mapare cu o interogare pe nume:

Listarea 9. Un fișier de mapare Hibernate cu o interogare pe nume

Listarea 9 definește cartografierea Hibernate unei clase de domeniu persoană cu două proprietăți: nume și greutate. Persoana - este un POJO simplu cu proprietățile menționate. Fișierul conține, de asemenea, o interogare care găsește toate cazurile de persoană în baza de date a cărei proprietate nume este parametrul specificat. Hibernare nu oferă funcționalitate spațiu de nume real, pentru interogările numite. În scopul acestei discuții, am folosi un prefix în numele tuturor cererilor în forma unei scurte (nu complet) numele clasei de domeniu. Într-o situație reală, poate o idee mai bună ar fi să se folosească numele complet de clasă, inclusiv numele pachetului.

Pas cu pas prezentare generală

Vezi toți pașii pe care trebuie să fie efectuate în procesul de creare și configurarea unui nou DAO pentru orice obiect de domeniu. Acești trei pași simpli sunt:

  1. Definiți o interfață care se extinde GenericDao și conține tot ce ai nevoie metode de căutare.
  2. Adăugați o interogare pe nume pentru fiecare metodă de căutare în fișierul de mapare hbm.xml pentru fiecare obiect de domeniu.
  3. Adăugați un fișier de configurare de primăvară 10-line pentru DAO.

Concluzionăm luarea în considerare discutarea codului (înregistrat numai o dată!) Care execută metodele mele Finder.

Reutilizabil DAO-class

Metodele folosite de primăvară-consilier și interceptor sunt triviale și locul lor de muncă este de fapt în circulație înapoi la GenericDaoHibernateImplClass. Toate apelurile, numele metodei, care începe cu descoperirea, sunt transferate DAO si o metoda executeFinder ().

Listarea 10. Implementarea FinderIntroductionAdvisor

executeFinder) Metoda (

Singura metodă care este absentă în modul prezentat în Exemplul 10, implementarea este executeFinder metoda (). Acest cod arată pentru titlu și apelați metoda de clasă, și le compară cu numele de Hibernate-interogare utilizând configurația acordului. Puteți utiliza, de asemenea, pentru a permite FinderNamingStrategy alte modalități de a numi interogări. Implementarea implicit caută o cerere cu numele ClassName.methodName. în cazul în care ClassName - este un nume scurt, fără pachete. Listarea 11 prezintă punerea în aplicare a finalizării DAO meu generic tastat:

Listarea 11. Punerea în aplicare executeFinder ()

în concluzie

Înainte de Java 5 limbă nu au susținut scrierea de cod care ar fi atât de generalizată și dactilografiat; a trebuit să aleagă una din cele două lucruri. În acest articol, ați văzut doar un exemplu de template-uri folosind Java 5 clase (generice), în combinație cu instrumente, cum ar fi Spring si Hibernate (si AOP) pentru a îmbunătăți performanța. Generic clasa tastat-DAO este relativ ușor de a scrie. Tot ce ai nevoie - o singură interfață, mai multe interogări numit, și adăugarea de 10-line la fișierul de configurare de primăvară. Ca rezultat, vei reduce foarte mult riscul de erori și de a economisi timp.

Aproape toate codul sursă prezentat în acest articol, este reutilizabil. În timp ce dvs. DAO-clase pot conține tipuri de interogări sau operațiuni care nu puse în aplicare aici (de exemplu, operațiunile de grup), ar trebui să fie în măsură să pună în aplicare cel puțin unele dintre ele folosind tehnicile demonstrate de mine. Pentru a explora alte implementări generalizate dactilografiat DAO clasă, se referă la „resurse“.

mulțumesc