Java 中利用泛型和反射机制抽象DAO的实例
Java中利用泛型和反射机制抽象DAO的实例
一般的DAO都有CRUD操作,在每个实体DAO接口中重复定义这些方法,不如提供一个通用的DAO接口,具体的实体DAO可以扩展这个通用DAO以提供特殊的操作,从而将DAO抽象到另一层次,令代码质量有很好的提升
1.通用接口
importjava.io.Serializable; importjava.util.List; publicinterfaceBaseDao{ Tget(Serializableid); List getAll(); //List find(Stringhql,); voidsave(Objecto); voidremove(Objecto); voidupdate(Objecto); }
2.DAO基类
importjava.io.Serializable; importjava.lang.reflect.ParameterizedType; importjava.lang.reflect.Type; importjava.util.List; importorg.springframework.orm.hibernate3.support.HibernateDaoSupport; publicclassHibernateBaseDaoextendsHibernateDaoSupportimplementsBaseDao { privateClass entityClass; publicHibernateBaseDao(){ TypegenType=getClass().getGenericSuperclass(); Type[]params=((ParameterizedType)genType).getActualTypeArguments(); entityClass=(Class)params[0]; } publicTget(Serializableid){ return(T)getHibernateTemplate().load(entityClass,id); } publicList getAll(){ returngetHibernateTemplate().loadAll(entityClass); } publicvoidsave(Objecto){ getHibernateTemplate().saveOrUpdate(o); } publicvoidremove(Objecto){ getHibernateTemplate().delete(o); } publicvoidupdate(Objecto){ getHibernateTemplate().update(o); } }
这里利用反射机制获取泛型对应的实体类的类型
3.实体DAO类
importjava.util.Iterator; importjava.util.List; importcom.baobaotao.dao.ForumDao; importcom.baobaotao.dao.HibernateBaseDao; importcom.baobaotao.domain.Forum; publicclassForumHibernateDao2extendsHibernateBaseDaoimplementsForumDao{ publiclonggetForumNum(){ Iteratoriter=getHibernateTemplate().iterate( "selectcount(f.forumId)fromForumf"); return((Long)iter.next()); } }
通过扩展泛型DAO基类,就自动拥有基类的数据操作功能,只要提供特殊的功能即可,实体DAO的编码生产率得到了极大的提高
以上就是Java中利用泛型和反射机制抽象DAO的实例的讲解,大家如果对泛型及反射机制有不明白的可以查询本站的相关文章或者留言交流,到社区提问,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!