怎么用泛型对DAO层进行简化~~

showtime520 2008-06-02 08:29:01
怎么用泛型对DAO层进行简化~~越详细越好
...全文
170 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChDw 2008-06-03
  • 打赏
  • 举报
回复
domainClass = (Class<T>) thisType.getActualTypeArguments()[0];



改成
type = (Class<T>) thisType.getActualTypeArguments()[0];



没有修改过来,呵呵
ChDw 2008-06-03
  • 打赏
  • 举报
回复
super.setType(AnyTable.class);

这个方法其实没有必要存在

改成这样:

public abstract class BaseDAOImpl <T ,ID extends java.io.Serializable> extends HibernateDaoSupport implements IBaseDAO <T,ID> {
private Class<T> type = getTypeClass();
private Class<T> getTypeClass() {
if (type == null) {
ParameterizedType thisType = (ParameterizedType) getClass().getGenericSuperclass();
domainClass = (Class<T>) thisType.getActualTypeArguments()[0];
}
return type;
}
}



public class AnyTableDAO extends BaseDAOImpl <AnyTable ,Integer> {
}




这样就可以了
M_song 2008-06-03
  • 打赏
  • 举报
回复
所谓泛型就是:将算法与其作用的数据结构分离,并将后者尽可能泛化,最大限度地实现算法重用。
所以可以实现对DAO层进行简化,就看做的粒度了!

楼上的代码可行!
new_bird_0001 2008-06-02
  • 打赏
  • 举报
回复
某张表:
public class AnyTableDAO extends BaseDAOImpl<AnyTable ,Integer> {
private static final Log log = LogFactory.getLog(AnyTableDAO.class);

protected void initDao() {
super.setLog(log);
super.setType(AnyTable.class);

}
}
new_bird_0001 2008-06-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jdlsfl 的回复:]
想法不错,但真的能简化吗
DAO层跟具体的每张数据表都有关系的
[/Quote]
肯定是能够简化的:
basedao接口IBaseDAO:
package org.lidingzhong.util;

import java.util.List;

public interface IBaseDAO<T ,ID extends java.io.Serializable> {
public void save(T transientInstance);
public void delete(T persistentInstance);
public T findById(ID id);
public List<T> findByExample(T instance);
public List<T> findByProperty(String propertyName, Object value);
public List<T> findByHQLStr(String HQLStr);
public List<T> findAll();
public T merge(T detachedInstance);
public void attachDirty(T instance);
public void attachClean(T instance);
}
接口实现类:
package org.lidingzhong.util;

import java.util.List;

import org.apache.commons.logging.Log;
import org.hibernate.LockMode;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public abstract class BaseDAOImpl<T ,ID extends java.io.Serializable>
extends HibernateDaoSupport implements IBaseDAO<T,ID> {

private Log log ;

private Class<?> type ;
private String getTableClassName(){
return type.getName().substring(type.getName().lastIndexOf(".")+1);
}

protected void initDao() {
// do nothing
}

public void save(T transientInstance) {
log.debug("saving "+getTableClassName()+" instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}

public void delete(T persistentInstance) {
log.debug("deleting "+getTableClassName()+" instance");
try {
getHibernateTemplate().delete(persistentInstance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}

public T findById(ID id) {
log.debug("getting "+getTableClassName()+" instance with id: " + id);
try {
T instance = (T) getHibernateTemplate().get(
type.getName(), id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}

public List<T> findByExample(T instance) {
log.debug("finding "+getTableClassName()+" instance by example");
try {
List<T> results = getHibernateTemplate().findByExample(instance);
log.debug("find by example successful, result size: "
+ results.size());
return results;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}

public List<T> findByProperty(String propertyName, Object value) {
log.debug("finding "+getTableClassName()+" instance with property: " + propertyName
+ ", value: " + value);
try {
String queryString = "from "+getTableClassName()+" as model where model."
+ propertyName + "= ?";
return getHibernateTemplate().find(queryString, value);
} catch (RuntimeException re) {
log.error("find by property name failed", re);
throw re;
}
}

public List<T> findAll() {
log.debug("finding all "+getTableClassName()+" instances");
try {
String queryString = "from "+getTableClassName();
return getHibernateTemplate().find(queryString);
} catch (RuntimeException re) {
log.error("find all failed", re);
throw re;
}
}

public T merge(T detachedInstance) {
log.debug("merging TabArticle instance");
try {
T result = (T) getHibernateTemplate().merge(
detachedInstance);
log.debug("merge successful");
return result;
} catch (RuntimeException re) {
log.error("merge failed", re);
throw re;
}
}

public void attachDirty(T instance) {
log.debug("attaching dirty TabArticle instance");
try {
getHibernateTemplate().saveOrUpdate(instance);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}

public void attachClean(T instance) {
log.debug("attaching clean TabArticle instance");
try {
getHibernateTemplate().lock(instance, LockMode.NONE);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}

public List<T> findByHQLStr(String HQLStr) {
log.debug("finding "+getTableClassName()+" instance with HQL: " + HQLStr) ;
try {
return getHibernateTemplate().find(HQLStr);
} catch (RuntimeException re) {
log.error("find by property name failed", re);
throw re;
}
}

public void setLog(Log log) {
this.log = log;
}

public void setType(Class<?> type) {
this.type = type;
}
}
jdlsfl 2008-06-02
  • 打赏
  • 举报
回复
想法不错,但真的能简化吗
DAO层跟具体的每张数据表都有关系的
为什么我们要使用通用DAO接口呢,因为我们的数据库操作无非是增删改查,CRUD操作,我们不需要为每个实体去编写一个dao接口,对于相似的实体操作可以只编写一个通用接口,然后采用不同的实现! DAO已经成为持久的标准模式,DAO使结构清晰,面向接口编程为代码提供了规范。而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化解决方案的GenericHibernateDao实现类,被定义为抽象类,它提取了CRUD操作,这就是简化代码的关键,以便于更好的重用,这个就不给例子了,增删改都好写,查就需要各种条件了。 然后是各个领域对象的dao接口,这些dao接口都继承GenericDao接口,这样各个领域对象的dao接口就和传统dao接口具有一样的功能了。 下一步是实现类了,个自领域对象去实现各自的接口,还要集成上面的抽象类,这样就实现了代码复用的最大化,实现类中只需要写出额外的查询操作就可以了。当然还要获得域对象的Class实例,这就要在构造方法中传入Class实例。用spring提供的HibernateTemplate注入到GenericHibernateDao中,这样在各个实现类就可以直接调用HibernateTemplate来实现额外的查询操作了。 如果在实现类中不想调用某个方法(例如:update()),就可以覆盖它,方法中抛出UnsupportedOperationException()异常。

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧