डीएओ

उपलब्ध

डीएओ का परिचय

JDBC या हाइबरनेट के माध्यम से डेटाबेस के साथ काम करते समय, कोड अक्सर हम जितना चाहते हैं उससे अधिक बोझिल हो जाता है। एक डेटाबेस क्वेरी में अक्सर शामिल होते हैं:

  • आंकड़ा मान्यीकरण
  • अनुरोध पैरामीटर सेट करना
  • क्वेरी पैरामीटर के आधार पर एचक्यूएल क्वेरी चयन
  • मानदंड API का उपयोग करके क्वेरी बनाना
  • कैशिंग सेटिंग्स
  • प्रारंभिक त्रुटि प्रबंधन, आदि।

इसलिए, सामान्य अभ्यास डेटाबेस के साथ काम करने के लिए विशेष कक्षाएं बनाना है। ऐसी कक्षाओं को DAO, डेटा एक्सेस ऑब्जेक्ट कहा जाता है। उनका कार्य डेटाबेस के साथ काम करने की सभी जटिलताओं को छिपाना है और बाहरी रूप से एक सुंदर और सुविधाजनक इंटरफ़ेस प्रदान करना है।

उदाहरण:

public class EmployeeDAO {

   public List<Employee> getEmployeeList(int from, int count) {
   	String hqlQuery = “from Employee;
   	Query<Employee> query = session.createQuery(hqlQuery, Employee.class);
   	query.setFirstResult(from);
   	query.setMaxResults(count);
   	return query.getResultList();
  }

	public int getEmployeeCount() {
	     String hqlQuery = “select count(*) from Employee;
     	Query<Integer> query = session.createQuery(hqlQuery, Integer.class);
     	return query.getSingleResult();
   }

	public Employee getEmployeeByUniqName(String name) {
	     String hqlQuery = “from Employee where name = :name”;
     	Query<Integer> query = session.createQuery(hqlQuery, Employee.class);
     	query.setParameterr(“name”, name);
     	return query.getSingleResult();
   }
}

हमारे पास एक कर्मचारी वर्ग है , जिसकी मदद से हम डेटाबेस से कर्मचारी प्रकार की वस्तुओं को प्राप्त करते हैं। वर्ग स्वयं, हालांकि एनोटेशन से भरा हुआ है, इसमें डेटाबेस में स्वयं को सहेजने के तरीके शामिल नहीं हैं।

डीएओ के लाभ

इस उपाय के कई फायदे हैं:

सबसे पहले, हमने डीएओ कक्षा में डेटाबेस के साथ काम को पूरी तरह छुपाया है। यदि आप भविष्य में एचक्यूएल से क्राइटेरिया एपीआई या नेटिव क्वेरी में सभी प्रश्नों को फिर से लिखने का निर्णय लेते हैं, तो यह किसी भी तरह से इस वर्ग के बाहर के कोड को प्रभावित नहीं करेगा।

दूसरे, आप इन विधियों के व्यवहार को जटिल बना सकते हैं। आप कैशिंग, ईवेंट, पैरामीटर सत्यापन जोड़ सकते हैं। यह सब बाहरी कोड से छुपाया जाएगा।

तीसरा, अगर आपको ऐसी विधि की आवश्यकता है जो अभी तक मौजूद नहीं है, तो आप इसे यहां जोड़ दें। उदाहरण के लिए, मुझे एक ऐसी विधि की आवश्यकता है जो पहले से ही समाप्त हो चुके सभी उपयोगकर्ता कार्यों को वापस कर दे। तो मैं बस यह करूँगा:

public class EmployeeDAO {

   public List<Task> getExpiredTasks(int userId, int from, int count) {
   	String hqlQuery = “from Task where task.user.id = :id and deadline < curdate();
   	Query<Task> query = session.createQuery(hqlQuery, Task.class);
   	query.setFirstResult(from);
   	query.setMaxResults(count);
   	return query.getResultList();
  }

   public int getExpiredTasksCount(int userId) {
   	String hqlQuery = “select count(*) from Task where task.user.id = :id and deadline < curdate();
   	Query<Integer> query = session.createQuery(hqlQuery, Integer.class);
   	return query.getSingleResult();
  }
}

मैंने कक्षा में दो विधियाँ जोड़ीं:

  • getExpiredTasksCount() - उपयोगकर्ता के लिए समाप्त हो चुके कार्यों की संख्या लौटाता है
  • getExpiredTasks() - उपयोगकर्ता के लिए समाप्त हो चुके कार्यों की सूची लौटाता है

मुझे विधियों की आवश्यकता है - मैंने उन्हें जोड़ा। और मैं इसे तुरंत इस्तेमाल कर सकता हूं। मैं उन्हें बाद में ऑप्टिमाइज़ करूँगा।

इसके अलावा, इन विधियों को पुनर्लेखन और अनुकूलन से पहले इकाई परीक्षणों के साथ कवर किया जा सकता है, इसलिए हमें पता चल जाएगा कि डेटाबेस के साथ काम वैसा ही रहा है जैसा वह था।

मानक दृष्टिकोण

बहुत बार, डीएओ कक्षाओं में ऐसी विधियाँ होती हैं जो समान होती हैं। उदाहरण के लिए, ये:

टी getById (अंतिम लंबी आईडी) किसी वस्तु को उसकी आईडी से प्राप्त करें
सूची <टी> getItems (int से, int गिनती) दी गई सीमा के भीतर वस्तुओं की सूची प्राप्त करें
सूची <टी> getAll () किसी दिए गए प्रकार की सभी वस्तुएं प्राप्त करें
इंट गेटकाउंट () वस्तुओं की संख्या ज्ञात कीजिए
टी सेव (अंतिम टी इकाई) ऑब्जेक्ट को डेटाबेस में सहेजें
टी अद्यतन (अंतिम टी इकाई) डेटाबेस में ऑब्जेक्ट अपडेट करें
शून्य हटाएं (अंतिम टी इकाई) डेटाबेस से किसी वस्तु को हटाना
शून्य हटाएंById (अंतिम लंबी इकाई आईडी) आईडी द्वारा डेटाबेस से ऑब्जेक्ट हटाएं

ये विधियाँ दुनिया में लगभग हर DAO वर्ग में पाई जाती हैं। अब, यदि किसी प्रकार का DAO वर्ग है, तो 90% संभावना के साथ उसके पास ऐसे तरीके होंगे।

हां, और भी हो सकते हैं, लेकिन वे भी होंगे। क्योंकि यह बहुत ही सुविधाजनक है। और यह आपको सीधे आधार या हाइबरनेट से बातचीत करने की अनुमति नहीं देता है।

और अगर समान तरीके हैं, तो उन्हें क्या चाहिए? यह सही है, इसे बेस क्लास में रखें।

ऐसा कुछ दिखता है:

public abstract class AbstractHibernateDao<T > {
    private final Class<T> clazz;
    private SessionFactory sessionFactory;

    public AbstractHibernateDao(final Class<T> clazzToSet)   {
    	this.clazz = clazzToSet;
    }

    public T getById(final long id) {
    	return (T) getCurrentSession().get(clazz, id);
    }

    public List<T> getItems(int from, int count) {
    	Query query = getCurrentSession().createQuery(clazz , "from " + clazz.getName())
    	query.setFirstResult(offset);
    	query.setMaxResults(count);
  	  return query.singleResult();
    }

    public List<T> findAll() {
    	return getCurrentSession().createQuery(clazz, "from " + clazz.getName()).list();
    }

    public T create(final T entity) {
    	getCurrentSession().saveOrUpdate(entity);
    	return entity;
    }

    public T update(final T entity) {
    	return (T) getCurrentSession().merge(entity);
    }

    public void delete(final T entity) {
    	getCurrentSession().delete(entity);
    }

    public void deleteById(final long entityId) {
    	final T entity = getById(entityId);
    	delete(entity);
    }

    protected Session getCurrentSession() {
    	return sessionFactory.getCurrentSession();
    }
}

और फिर हमारा EmployeeDAO इस तरह दिखेगा:

public class EmployeeDAO extends AbstractHibernateDAO<Employee> {

   public EmployeeDAO (){
  	super(Employee.class );
   }
}

और टास्कडीएओ ऐसा है:

public class TaskDAO extends AbstractHibernateDAO<Task> {

   public TaskDAO (){
  	super(Task.class );
   }
}

और इन दोनों वर्गों में वे सभी विधियाँ होंगी जिन्हें हमने AbstractHibernateDAO पर घोषित किया था । एकीकरण बहुत सुविधाजनक और व्यावहारिक है।

टिप्पणियां
  • लोकप्रिय
  • नया
  • पुराना
टिप्पणी लिखने के लिए आपको साइन इन करना होगा
इस पेज पर अभी तक कोई टिप्पणियां नहीं हैं