您的位置:首页 > 其它

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

2014-06-19 15:22 274 查看
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 {

}


这样一来 增删改查都不用再写了,以后只需要根据项目的业务来增加或修改方法就可以了,是不是减少了很多冗余代码呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐