ডিএও

বিদ্যমান

DAO এর ভূমিকা

JDBC এর মাধ্যমে বা হাইবারনেটের মাধ্যমে একটি ডাটাবেসের সাথে কাজ করার সময়, কোডটি প্রায়শই আমাদের পছন্দের চেয়ে বেশি কষ্টকর হয়ে ওঠে। একটি ডাটাবেস ক্যোয়ারী প্রায়ই থাকে:

  • তথ্য বৈধতা
  • অনুরোধ পরামিতি সেটিং
  • HQL ক্যোয়ারী নির্বাচন ক্যোয়ারী প্যারামিটারের উপর নির্ভর করে
  • মানদণ্ড API ব্যবহার করে একটি ক্যোয়ারী তৈরি করা
  • ক্যাশিং সেটিংস
  • প্রাথমিক ত্রুটি পরিচালনা, ইত্যাদি

অতএব, সাধারণ অনুশীলন হল ডাটাবেস নিয়ে কাজ করার জন্য বিশেষ ক্লাস তৈরি করা। এই ধরনের ক্লাসগুলিকে বলা হয় DAO, Data Access Object. তাদের কাজ হল ডাটাবেসের সাথে কাজ করার সমস্ত জটিলতা লুকিয়ে রাখা এবং বাইরের জন্য একটি সুন্দর এবং সুবিধাজনক ইন্টারফেস প্রদান করা।

উদাহরণ:

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();
   }
}

আমাদের একটি ক্লাস EmployeeDAO আছে , যার সাহায্যে আমরা ডাটাবেস থেকে Employee টাইপের বস্তু পাই। ক্লাস নিজেই, যদিও টীকা দিয়ে ঠাসা, ডাটাবেসে নিজেকে সংরক্ষণ করার পদ্ধতি ধারণ করে না।

DAO এর সুবিধা

এই পদ্ধতির অনেক সুবিধা আছে:

প্রথমত, আমরা DAO ক্লাসে ডাটাবেসের সাথে কাজটি সম্পূর্ণরূপে লুকিয়ে রেখেছি। আপনি যদি ভবিষ্যতে HQL থেকে Criteria API বা Native Query-তে সমস্ত প্রশ্ন পুনরায় লেখার সিদ্ধান্ত নেন, তাহলে এটি এই শ্রেণীর বাইরের কোডকে কোনোভাবেই প্রভাবিত করবে না।

দ্বিতীয়ত, আপনি এই পদ্ধতিগুলির আচরণকে জটিল করতে পারেন। আপনি ক্যাশিং, ইভেন্ট, প্যারামিটার বৈধতা যোগ করতে পারেন। এই সব বাইরের কোড থেকে লুকানো হবে.

তৃতীয়ত, আপনার যদি এমন একটি পদ্ধতির প্রয়োজন হয় যা এখনও বিদ্যমান নেই, আপনি কেবল এটি এখানে যোগ করুন। উদাহরণস্বরূপ, আমার এমন একটি পদ্ধতি দরকার যা ইতিমধ্যে মেয়াদ শেষ হয়ে যাওয়া সমস্ত ব্যবহারকারীর কাজগুলিকে ফিরিয়ে দেবে। তারপর আমি শুধু এই কাজ করব:

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() - ব্যবহারকারীর জন্য মেয়াদোত্তীর্ণ কাজের একটি তালিকা প্রদান করে

আমার পদ্ধতি দরকার - আমি সেগুলি যোগ করেছি। এবং আমি এখনই এটি ব্যবহার করতে পারি। আমি পরে তাদের অপ্টিমাইজ করব.

তদুপরি, এই পদ্ধতিগুলি পুনঃলিখন এবং অপ্টিমাইজেশনের আগে ইউনিট পরীক্ষার মাধ্যমে কভার করা যেতে পারে, তাই আমরা জানব যে ডাটাবেসের সাথে কাজটি আগের মতোই রয়েছে।

স্ট্যান্ডার্ড অ্যাপ্রোচ

খুব প্রায়ই, DAO ক্লাসে একই পদ্ধতি থাকে। উদাহরণস্বরূপ, এইগুলি:

T getById (চূড়ান্ত দীর্ঘ আইডি) তার আইডি দ্বারা একটি বস্তু পান
তালিকা<T> getItems (int from, int count) একটি নির্দিষ্ট পরিসরের মধ্যে বস্তুর একটি তালিকা পান
তালিকা<T> getAll () একটি প্রদত্ত ধরনের সব বস্তু পান
int getCount () বস্তুর সংখ্যা বের করুন
T সংরক্ষণ (চূড়ান্ত T সত্তা) ডাটাবেসে অবজেক্ট সেভ করুন
T আপডেট (চূড়ান্ত T সত্তা) ডাটাবেসে অবজেক্ট আপডেট করুন
বাতিল মুছে ফেলুন (চূড়ান্ত টি সত্তা) ডাটাবেস থেকে একটি বস্তু মুছুন
void deleteById (চূড়ান্ত দীর্ঘ সত্তা আইডি) আইডি দ্বারা ডাটাবেস থেকে অবজেক্ট মুছুন

এই পদ্ধতিগুলি বিশ্বের প্রায় প্রতিটি 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();
    }
}

এবং তারপরে আমাদের কর্মচারী ডিএও এর মতো দেখাবে:

public class EmployeeDAO extends AbstractHibernateDAO<Employee> {

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

এবং TaskDAO এই মত:

public class TaskDAO extends AbstractHibernateDAO<Task> {

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

এবং এই উভয় ক্লাসেই আমরা AbstractHibernateDAO- তে ঘোষিত সমস্ত পদ্ধতি থাকবে । একীকরণ খুবই সুবিধাজনক এবং ব্যবহারিক।

মন্তব্য
  • জনপ্রিয়
  • নতুন
  • পুরানো
মন্তব্য লেখার জন্য তোমাকে অবশ্যই সাইন ইন করতে হবে
এই পাতায় এখনও কোনো মন্তব্য নেই