jiangyaning 2011-04-09
Hibernate的Dao简写
Spring为了简写SSH中的DAO层,提供了HibernateDaoSupport类。让我们基本上可以一句话就可以完成对数据库的一个原子操作(增,删,改,查)。
代码写久之后就发现,每个类中都有代码相似度达90%的(增,删,改,查)的5个方法。(查是两个方法)。
既然代码中只是类名不同而已。想到用泛型抽象。代码如下:
DAO的接口:
import java.util.List; /** * 使用泛型编写 Dao中的增删改查。 * @author King_wangyao * * @param <T> */ public interface EntityDao<T> { Integer save(T t);//保存一个对象。 Integer update(T t);//更新一个对象。 Integer delete(T t);//删除一个对象。 T get(Integer id);//根据ID查询一个对象。 List<T> find();//查询所有的对象。 }DAO 的实现类:
@SuppressWarnings("unchecked") public class EntityDaoSupport<T> extends MyHibernateDaoSupport implements EntityDao<T> { //泛型的Class private Class<T> entityClass; // 根据反射得到泛型的class. public EntityDaoSupport() { entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; } @Override public Integer save(T o) { this.getHibernateTemplate().save(o); return 1; } @Override public Integer update(T o) { this.getHibernateTemplate().saveOrUpdate(o); return 1; } @Override public Integer delete(T o) { this.getHibernateTemplate().delete(o); return 1; } @Override public T get(Integer id) { T o = (T) this.getHibernateTemplate().get(entityClass, id); return o; } @Override public List<T> find() { List<T>list=this.getHibernateTemplate().find("from "+entityClass.getName()); if (list != null && list.size() > 0) { return list; } return null; } }
使用DAO接口:
public interface UserDao extends EntityDao<Admin>{ Admin find(String userName); Admin find(String userName,String userPass); }DAO的实现类:
@SuppressWarnings("unchecked") public class UserDaoHibernate extends EntityDaoSupport<Admin> implements UserDao { public Admin find(String userName) { List<Admin> list = this.getHibernateTemplate().find("from Admin where userName=?",userName); if (list != null && list.size() > 0) { return list.get(0); } return null; } public Admin find(String userName, String userPass) { List<Admin> list = this.getHibernateTemplate().find("from Admin where userName=? and userPass=?",new String[]{userName,userPass}); if (list != null && list.size() > 0) { return list.get(0); } return null; } }
这样以来,则可以在实际开发时写DAO层就不要每次都去写5大方法了。但在Service层中是可以正确调用的这5大方法的。