Java 中利用泛型和反射机制抽象DAO的实例
发布于 2020-6-19|
复制链接
摘记: Java 中利用泛型和反射机制抽象DAO的实例一般的DAO都有CRUD操作,在每个实体DAO接口中重复定义这些方法,不如提供一个通用的DAO接口,具体的实体DAO可以扩展这个通用DAO以提供特殊的操作,从而将DAO抽象到另一层次,令代码质量有很好的提升1.通用接口 ..
Java 中利用泛型和反射机制抽象DAO的实例一般的DAO都有CRUD操作,在每个实体DAO接口中重复定义这些方法,不如提供一个通用的DAO接口,具体的实体DAO可以扩展这个通用DAO以提供特殊的操作,从而将DAO抽象到另一层次,令代码质量有很好的提升1.通用接口
```java
import java.io.Serializable;
import java.util.List;
public interface BaseDao {
T get(Serializable id);
List getAll();
// List find(String hql,);
void save(Object o);
void remove(Object o);
void update(Object o);
}
```
2.DAO基类
```java
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class HibernateBaseDao extends HibernateDaoSupport implements BaseDao{
private Class entityClass;
public HibernateBaseDao() {
Type genType = getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
entityClass = (Class)params[0];
}
public T get(Serializable id) {
return (T)getHibernateTemplate().load(entityClass, id);
}
public List getAll() {
return getHibernateTemplate().loadAll(entityClass);
}
public void save(Object o) {
getHibernateTemplate().saveOrUpdate(o);
}
public void remove(Object o) {
getHibernateTemplate().delete(o);
}
public void update(Object o) {
getHibernateTemplate().update(o);
}
}
```
这里利用反射机制获取泛型对应的实体类的类型3.实体DAO类
```java
import java.util.Iterator;
import java.util.List;
import com.baobaotao.dao.ForumDao;
import com.baobaotao.dao.HibernateBaseDao;
import com.baobaotao.domain.Forum;
public class ForumHibernateDao2 extends HibernateBaseDao implements ForumDao{
public long getForumNum() {
Iterator iter = getHibernateTemplate().iterate(
"select count(f.forumId) from Forum f");
return ((Long)iter.next());
}
}
```