Generic Dao ile crud işlemlerini tekrarlamaktan kaçının!
Merhaba arkadaşlar,
Sizlere Dao katmanını dizayn ederken işinizi gerçekten kolaylaştıracak bir yöntemden bahsedeceğim.
Öncelikle biliyorsunuz ki temel crud işlemleri çoğu projelerde bulunur ve kullanılır. Bizim elimizdede bir sürü tablo varsa her tablo için ayrı select,update,delete yazmaktan yorulabiliriz. İşte burada Generic Dao devreye giriyor.
IGenericDao arayüzümüzü aşağıda şekilde oluşturuyoruz.
public interface IGenericDao <T> { void insert(T o); T find(Integer id); void update(T o); void delete(T o); }
Ardından GenericDao implementasyonumuzu oluşturmamız gerekiyor. Her bir crud işlemi için tanımladığım methodları yazıyorum.
public class GenericDao <T> implements IGenericDao<T>{ private Class<T> type; private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } @Autowired public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public GenericDao() { Type t = getClass().getGenericSuperclass(); ParameterizedType pt = (ParameterizedType) t; type = (Class) pt.getActualTypeArguments()[0]; } public void insert(T o) { Session session = getSessionFactory().getCurrentSession(); session.beginTransaction(); session.save(o); session.getTransaction().commit(); } public void update(T o) { Session session = getSessionFactory().getCurrentSession(); session.beginTransaction(); session.update(o); session.getTransaction().commit(); } public void delete(T o) { Session session = getSessionFactory().getCurrentSession(); session.beginTransaction(); session.delete(o); session.getTransaction().commit(); } @Override public T find(Integer id) { Session session = getSessionFactory().getCurrentSession(); session.beginTransaction(); @SuppressWarnings("unchecked") T o = (T) session.get(type, id); session.getTransaction().commit(); return o; } }
Şimdi ise diyelim ki elimizde bir User tablosunu temsil eden User sınıfımız var ve GenericDao’dan yararlanarak temel crud işlemleri yaptırmak istiyoruz. O halde şöyle olması gerekiyor.
public interface IUserDao extends IGenericDao<User> { // Şimdilik ekstra bir method tanımlamıyorum. Siz isterseniz // temel crud methodlarının yanında kendinize özel methodlar tanımlayabilirsiniz }
Şimdide implementasyonumuzu yazmamız gerekiyor.
public class UserDao extends GenericDao<User> implements IUserDao{ }
Artık UserDao için dahil ettiğimiz GenericDao’daki tüm methodları kullanabiliriz.