मैं आमतौर पर इस तरह के रूप में मेरे सभी डोमेन संस्थाओं के लिए सामान्य तरीके, की परिभाषा के साथ एक बुनियादी दाव इंटरफ़ेस बनाने के लिए करते हैं:
// marker interface
public interface DomainEntity extends Serializable { }
// common dao methods
public interface DAO<T extends DomainEntity> {
public T findById(Long id);
public List<T> findAll();
public T save(T entity);
public boolean update(T entity);
public boolean delete(T entity);
}
और फिर मेरी आवश्यकताओं के आधार पर एक या अधिक कार्यान्वयन प्रदान करते हैं:
// implementation of common dao methods using JPA
public class JpaDAO<T> implements DAO<T> {
private EntityManager em;
public JpaDao(EntityManager em) { this.em = em; }
// Default implementations using JPA...
}
// implementation of common dao methods using JDBC
public class JdbcDAO<T> implements DAO<T> {
private Connection conn;
public JdbcDao(Connection conn) { this.conn = conn; }
// Default implementations using JDBC
}
अब
, यह मानते हुए मैं निम्नलिखित व्यक्ति वर्ग है:
public class Person implements DomainEntity {
private Long id;
private String firstName;
private String lastName;
// getters/setters...
}
मैं पहली बार इतनी तरह एक सामान्य PersonDAO इंटरफेस को परिभाषित:
public interface PersonDAO implements DAO<Person> {
public List<Person> findByFirstName(String name);
public List<Person> findByLastName(String name);
}
ध्यान दें कि ऊपर मेरी विशेष इकाई दाव इंटरफ़ेस में, मैं केवल अतिरिक्त तरीकों जो मेरे डोमेन इकाई के लिए विशिष्ट हैं शामिल किया है। सामान्य इंटरफेस सुपर इंटरफेस द्वारा विरासत में प्राप्त होते हैं और जेनेरिक का उपयोग करके मेरी डोमेन इकाई में पैरामीटर किए जाते हैं।
package mypackage.daos.jpa;
public class PersonDAOImpl extends JpaDAO<Person> implements PersonDAO {
// here i implement only the entity specific dao methods
// defined in the last interface.
}
(जेपीए के बजाय JDBC के आधार पर कहते हैं) मैं भी एक विकल्प के डीएओ कार्यान्वयन प्रदान करने के लिए की जरूरत है,:
अब अंतिम शेष बात तो की तरह, मेरे इकाई विशिष्ट विधियों के विभिन्न कार्यान्वयन को परिभाषित करने के लिए है
package mypackage.daos.jdbc;
public class PersonDAOImpl extends JdbcDAO<Person> implements PersonDAO {
// again i only implement the entity specific DAO methods since
// defaults have been implemented in the super class...
}
इस बारे में अच्छी बात यह है कि आप बुला कोड है कि से प्रभावित करने के लिए बिना कार्यान्वयन स्विच कर सकते हैं है: एक द्वितीय श्रेणी बनाने (अधिमानतः एक अलग पैकेज में) के रूप में अपनी के रूप में आसान
// a service class that uses my dao
public class PersonService {
private PersonDAO dao;
public PersonService(PersonDAO dao) { this.dao = dao }
public void doSomethingUseful() {
// use the dao here...
}
}
आमतौर पर, उचित दाव कार्यान्वयन (JDBC या जेपीए) सेवा निर्माण के दौरान निर्माता के माध्यम से इंजेक्ट किया जाएगा। बेशक आप केवल एक ही कार्यान्वयन कर सकते हैं यदि आप चाहें (यानी जेपीए)।
मेरी प्रोजेक्ट में, मैंने एक सर्चक्रिटिया ऑब्जेक्ट बनाया जिसमें तालिका के कॉलम शामिल हैं जिसके लिए डीएओ संबंधित है। फिर आप इस सर्चक्रिटिया ऑब्जेक्ट्स में विवरण प्रदान करते हैं और अपने डीएओ के अंदर उस पर आधारित खोज करते हैं। – Atul
और हाँ, मुझे नहीं लगता कि इस के लिए कोई विशिष्ट डिजाइन पैटर्न है। – Atul