[size=medium][color=brown]Hibernate 的 Dao 简写[/color] [/size]
Spring 为了简写SSH中的DAO层,提供了HibernateDaoSupport类。让我们基本上可以一句话就可以完成对数据库的一个原子操作(增,删,改,查)。
代码写久之后就发现,每个类中都有代码相似度达90%的(增,删,改,查)的5个方法。(查是两个方法)。
既然代码中只是 类名不同而已。想到用泛型抽象。代码如下:
DAO的接口:
使用DAO 接口:
这样以来,则可以在实际开发时写DAO层就不要每次都去写5大方法了。但在Service层中是可以正确调用的这5大方法的。
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大方法的。