java泛型对我来说是一个很熟悉的概念了,虽然理解不是太深刻。以前用的多的是在java基本类型中加入泛型处理,用起来比较方便。
例如:HashMap<Student stu> map = new HashMap<Student stu> ();
最近用到struts2+spring+ibatis框架的时候,现有的框架自己感觉很糟糕,就想自己搭一个属于自己的框架。对于spring自己觉得了解的并不深入,要用到spring的依赖注入,在dao层就要每个dao都最好有一个接口和实现,就像hibernate生成里面的(看了网上的一个leave,用到的是ssh框架)的例子。想要这些实体dao和daoimpl都有一个基类,能够在基类种实现所有业务类的公用数据库操作方法,这样统一管理,代质量更加高一些。开始是想用接口和基类实现的,结果不能达到想要的效果,继承接口的接口的实现类必须要实现接口和它的父接口的所有方法,这样达不到方法的重用。
看了leave的实现,用到了泛型接口和泛型基类,很好的实现了这一设想。
实现的结构如下:
接口BaseDao:
package org.forever.leave.dao.base;
import java.io.Serializable;
import java.util.List;
public interface BaseDao<T> {
public void save(T entity);
public void update(T entity);
public void delete(T entity);
public T find(Serializable id);
public List<T> findAll();
}
基类BaseDaoImpl:
package org.forever.leave.dao.base;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.hibernate3.HibernateTemplate;
public class BaseDaoImpl<T> implements BaseDao<T> {
protected static Log log = LogFactory.getLog(BaseDaoImpl.class);
private final String entityName;
@Resource protected HibernateTemplate hibernateTemplate;
@SuppressWarnings("unchecked")
public BaseDaoImpl() {
Type type = this.getClass().getGenericSuperclass();
if (!(type instanceof ParameterizedType)) {
throw new RuntimeException("没有传递类型参数T");
}
ParameterizedType pt = (ParameterizedType) type;
this.entityName = ((Class<T>) pt.getActualTypeArguments()[0]).getName();
}
public void delete(T entity) {
}
public void save(T entity) {
hibernateTemplate.save(entityName,entity);
}
public void update(T entity) {
}
protected Object findUniqueResult(String hql, Object... value) {
List<?> list = hibernateTemplate.find(hql,value);
if(list.size()==0) return null;
return list.get(0);
}
@SuppressWarnings("unchecked")
@Override
public T find(Serializable id) {
return (T) hibernateTemplate.get(entityName, id);
}
@SuppressWarnings("unchecked")
@Override
public List<T> findAll() {
return hibernateTemplate.find("FROM " + entityName);
}
}
实例接口UserDao :
package org.forever.leave.dao;
import org.forever.leave.dao.base.BaseDao;
import org.forever.leave.entities.User;
public interface UserDao extends BaseDao<User>{
}
实例类UserDao Impl:
package org.forever.leave.dao.impl;
import org.forever.leave.dao.UserDao;
import org.forever.leave.dao.base.BaseDaoImpl;
import org.forever.leave.entities.User;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {
public UserDaoImpl(){}
}
这样,就能够在基类种实现所有业务类的公用数据库操作方法,在具体的实现类中只要加入特有的方法就行了,大大提高了代码的质量和重用性。
测试一下test类:
package org.forever.leave.test;
import org.forever.leave.dao.impl.UserDaoImpl;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
UserDaoImpl dao = new UserDaoImpl();
dao.delete(entity);//注意这里的delete方法传入的就是一个User参数的Entity.而这个方法实体是在BaseDaoImpl中实现的。
}
}
这里讲到了java泛型的一个使用,也是一个在搭建基于spring的框架的一个方法。看到一篇讲泛型的不错的文章:
http://blog.youkuaiyun.com/explorers/archive/2005/08/15/454837.aspx 大家分享学习。