我相信在做hibernate高手都会发现很多dao类,而且这类dao类有很大的冗余。加大维护和测试量,而最终也做了很多无用功的测试和维护,这里我只做个简单演示,我在做项目的心得而已,欢迎批评指教。
首先我们建立接口:
写道
public interface IEntityDao <T> {
public void saveEntity(T t);
public <T> T getEntityById(long id);
}
public void saveEntity(T t);
public <T> T getEntityById(long id);
}
对接口的实现:
写道
public class EntityDaoImpl<T> implements IEntityDao<T> {
private Class<T> clazz;
public EntityDaoImpl() {
private Class<T> clazz;
public EntityDaoImpl() {
//特别就在这里,T的类型没有确定程序就会报错
clazz = GenericUtils.getSuperClassGenericType(this.getClass());
}
public <T> T getEntityById(long id) {
System.out.println(clazz);
return null;
}
public void saveEntity(T t) {
System.out.println(t);
}
}
clazz = GenericUtils.getSuperClassGenericType(this.getClass());
}
public <T> T getEntityById(long id) {
System.out.println(clazz);
return null;
}
public void saveEntity(T t) {
System.out.println(t);
}
}
上面泛型我们是用到了,那么如何来确定T的类型,这里就用到了反射机制
反射机制代码:
写道
/**
* 泛型的常用类,这里通过反射,获取父类的参数类型,获取父类的参数类型其实就是Class类型
* 这里就hiberante为例子,一般来说做数据库dao层开发有很多的pojo,如果为每一个pojo做一个持久层,那么 代码是很冗余的。
* 假如:有Customer ,Manager两个类,可能就会有CustomerDao,ManagerDao 那么内面的代码就会有很冗余,
* 但是用反射机制动态来确定运行时的类型就可以解决类的冗余问题假设用到hibernate , GenericsDao<T> T代表泛型,例如 T
* 可以是Customer ,Manager。 对于ManagerDao我们就可以这样写 ManagerDao extends
* GenericsDao<Manager>
*
* @author Administrator
*
*/
public class GenericUtils {
private GenericUtils() {
}
/**
* 获取父类的参数类型
*
* @param clazz
* @param index
* 指泛型引索
* @return
*/
public static Class getSuperClassGenericType(Class clazz, int index) {
Type type = clazz.getGenericSuperclass();
if (!(type instanceof ParameterizedType)) {
return Object.class;
}
Type[] types = ((ParameterizedType) type).getActualTypeArguments();
if (index >= types.length || index < 0) {
return Object.class;
}
if (types[index] instanceof Class) {
return Object.class;
}
return (Class) types[index];
}
public static Class getSuperClassGenericType(Class clazz) {
return getSuperClassGenericType(clazz, 0);
}
}
注释写得很清楚我就不用多说,下面就看看如何来用它,代码如下:
写道
public class ManagerDao extends EntityDaoImpl<Manager> {
}
}
public class CustomerDao extends EntityDaoImpl<Customer> {
}
}
看上面避免了很多重复代码只需要一个简单的继承而已。