关于HIbernate在dao层的最佳实践。

来源:互联网 发布:计算机c语言基础知识 编辑:程序博客网 时间:2024/04/28 12:17

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> {@Resourceprivate 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);}//获得当前的sessionprotected 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 {}
   

这样一来  增删改查都不用再写了,以后只需要根据项目的业务来增加或修改方法就可以了,是不是减少了很多冗余代码呢?

0 0
原创粉丝点击