Hi ~大家好,好久没写博客了。最近复习一些框架的知识,顺便写些东西来整理一下。
今天要记录的就是关于hibernate在dao层的增删改查。
相信很多刚入门的朋友在写dao层代码的时候,都是一个实体对应一个dao
然后里面都是写满了增删改查,自己以前也是,不过为了效率,我们必须剔除这些冗余代码了。
反射 + 泛型 可以帮我们解决这些东西。
首先这是项目的一些简单架构
说明 :
第一步: BaseDao<T>
/** * 使用泛型 使传入的实体类型不受限制 * 减少各自独立的dao操作 * @author wzh * * @param <T> */ public interface BaseDao<T> { //增加 void save(T entity); //删除 void delete(Long id); //修改 void update(T entity); //根据ID获取 T getById(Long id); //根据多个ID获取 List<T> getByIds(Long[] id); //获取所有 List<T> findAll(); }
然后继续对dao进行抽象:
public class BaseDaoImpl<T> implements BaseDao<T> { @Resource private SessionFactory sf ; private Class<T> clazz = null; //获得T的真实类型 public BaseDaoImpl(){ ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); //第一个真实类型 this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; System.out.println(clazz); } //获得当前的session protected Session getSession(){ return this.sf.getCurrentSession(); } public void delete(Long id) { Object obj = getById(id); if(obj != null){ getSession().delete(obj); } } public List<T> findAll() { return getSession().createQuery("FROM "+clazz.getSimpleName()).list(); } public T getById(Long id) { return (T) getSession().get(clazz, id); } public List<T> getByIds(Long[] ids) { return getSession().createQuery(// "FROM "+clazz.getSimpleName()+" WHERE id IN (:ids)") .setParameterList("ids", ids).list(); } public void save(T entity) { getSession().save(entity); } public void update(T entity) { getSession().update(entity); } }
解释: 在构造函数中,可以动态的获取泛型传入的类型,即使传入User、Student、Teacher等实体
我们仅需要在这些实体对应的dao实现类上这样干就行。
public class StudentDaoImpl extends BaseDaoImpl<Student> implements StudentDao { }
这样一来 增删改查都不用再写了,以后只需要根据项目的业务来增加或修改方法就可以了,是不是减少了很多冗余代码呢?