泛型DAO跟SSH框架是没有任何关系的,下面我就以SSH中的泛型DAO为例,说说自己对泛型DAO的理解。
首先你要知道这样的几个通俗易懂的概念:
1.通用DAO:IGenericDAO
2.通用DAO的实现: GenericDAOImpl
3.具体的DAO:IUserDAO
4.具体的DAO的实现:UserDAOImpl
这样说吧:通用DAO,是一个接口,定义了标准,它封装了对数据库的各方面操作,增删查改,一般还有分页,通过ID查找实体等一系列方法
通用DAOImpl,一般来说是一个,一个普通的类,实现了:1)HibernateDaoSupport,这样才能将DAO自动装载到配置sessionFactory中,这样才具有对象持久化的
功 能
2)IGenericDAO,实现通用接口中的所有方法,因为都是泛型,在方法中写逻辑实现,传入什么实体就实
实现对应的功能。这个地方,它的参数还是泛型。
具体的实体接口IUserDAO:有很多人都有疑惑,这个接口要着干嘛,其实很简单,这个接口继承了通用DAO,并且可以加入任何你想加入的逻辑,比如登陆验证等业务
逻辑。就像一个公司的各个部门的自己的方法的封装,当然,这个逻辑可以直接通过在具体的DAO中实现,但是编程的思想是面向接口
的,也是制定标准的地方,所以写在接口中。这个地方传递的参数就是具体的参数了。
具体的DAO的实现UserDAOImpl类:它继承了通用DAO的实现:GenericDAOImpl,同时实现了具体自己DAO的接口。因为它通过泛型参数传递,那么它传递的是什
么参数,他就是这个参数的实现,也就是说,它实际上是IUserDAO的具体实现,也继承了普通IGenericDAO的所有关于对数据
的操作。其实这个时候通过
现在我们对比上面的看看具体的内容所述:
package cn.hglq4.eshop.dao;
import java.io.Serializable;
import java.util.List;
public interface IGenericDAO<T, ID extends Serializable> {
public void save(T entity);
public void delete(T entity);
public void deleteById(Class<T> entityClass, ID id);
public void update(T entity);
public T findById(Class<T> entityClass, ID id);
public List<T> findAll(Class<T> entityClass);
public List<Object> find(String hql, Object... values);
public int getTotalRows();
public int getPageSize(int size);
public List<T> findByPage(final int pageNo, final int size);
}
package cn.hglq4.eshop.dao.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.hglq4.eshop.dao.IGenericDAO;
public class GenericDAOImpl<T, ID extends Serializable> extends HibernateDaoSupport implements
IGenericDAO<T, ID> {
private Class<T> clazz;
public GenericDAOImpl(){
clazz=(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
@Override
public void save(T entity) {
getHibernateTemplate().save(entity);
}
@Override
public void delete(T entity) {
}
@Override
public void deleteById(Class<T> entityClass, ID id) {
}
@Override
public void update(T entity) {
}
@Override
public T findById(Class<T> entityClass, ID id) {
return null;
}
@Override
public List<T> findAll(Class<T> entityClass) {
return null;
}
@Override
public List<Object> find(String hql, Object... values) {
return null;
}
@Override
public int getTotalRows() {
return 0;
}
@Override
public int getPageSize(int size) {
return 0;
}
@Override
public List<T> findByPage(int pageNo, int size) {
return null;
}
}
package cn.hglq4.eshop.dao.user;
import cn.hglq4.eshop.dao.IGenericDAO;
import cn.hglq4.eshop.entity.user.Users;
public interface IUserDAO extends IGenericDAO<Users,Integer> {
public Users login(String account,String pwd);
}
package cn.hglq4.eshop.dao.impl.user;
import java.util.List;
import org.springframework.stereotype.Repository;
import cn.hglq4.eshop.dao.impl.GenericDAOImpl;
import cn.hglq4.eshop.dao.user.IUserDAO;
import cn.hglq4.eshop.entity.user.Users;
@Repository
public class UserDAOImpl extends GenericDAOImpl<Users,Integer> implements IUserDAO {
@Override
public Users login(String account, String pwd) {
List<Users> list=getHibernateTemplate().find("from Users where account=? and pwd=?", new Object[]{account,pwd});
if(list!=null&&list.size()==1){
return list.get(0);
}else{
return null;
}
}
}