现在的位置: 首页 > 综合 > 正文

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

2018年02月10日 ⁄ 综合 ⁄ 共 1543字 ⁄ 字号 评论关闭

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 {
	

}

   

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

抱歉!评论已关闭.