Hibernate 的 Dao 简写

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大方法的。

相关推荐