[size=large]首先第一点[/size]
我的理想是,使用这个dao时,只需要像
BaseDao userDao = new BaseDao<UserPO, UserVO>();
这样,就可以用它操作我想要操作的数据库对象(PO),用我想要的返回类型或参数(VO)
可惜我发现,这只是理想.java中的泛型实现是擦除式的,我不知道什么叫擦除式,只知道后果像getVOClass()方法中用反射不能获得当前类的泛型类型信息,而只能通过getGenericSuperclass()方法取得父类,求得父类的泛型类型信息,所以为了getVOClass()方法可用,我就必须用子类继承此BaseDao类,比如:
public class UserDao extends BaseDao<UserPO, UserVO>{}
而这样我又要每个po,vo对都做一个子类,如果项目中对应一个po,我需要有多个vo,比如有个UserQueryVO,也是对应的UserPO,那又要有一个
public class UserDao extends BaseDao<UserPO, UserQueryVO>{}
而不能像
public class UserDao<PO,VO> extends BaseDao<PO, VO>{}
这样用这样的需求很多,岂不是类爆炸?
并且,像我一开始所说,我想要的是一个通用的dao,所以这里我放弃了反射获得泛型类型,用了构造方法传入class
public BaseDao(Class poClass, Class voClass){
this.poClass = poClass;
this.voClass = voClass;
}
用的时候可以这样
BaseDao userDao = new BaseDao<UserPO, UserVO>(UserPO.class, UserVO.class);
没有理想中那么简洁,但也算凑合吧.毕竟这样可以解决问题[size=large]然后第二点[/size]
这个类的创建方式又难倒了我,按照上面所说的,我可以new一个BaseDao,可是我总不能每次db操作都new一个BaseDao对象吧.所以我考虑写个Factory,封装创建和缓存BaseDao对象,可是却没有办法写
因为java的泛型类型我没找到怎么动态指定,也就是说<>中的类定义不能动态.比如public BaseDao createDao(Class poClass, Class voClass) throws Exception{
return new BaseDao<poClass,voClass>(poClass, voClass);
}是不允许的我曾想过用spring注入,也google过资料,可是java语言本身都实现不了的东西,spring也没有办法现在的情况是,要么我每次数据库io都new一个BaseDao,要么用时到缓存去取,如果取不到的话再new一个,然后放到缓存中,如:BaseDao<UserPO, UserVO> userDao = DaoFactory.getDao(UserPO.class,UserVO.class);
if(null == userDao){
userDao = new BaseDao<UserPO, UserVO>(UserPO.class,UserVO.class);
DaoFactory.putDao(UserPO.class,UserVO.class, userDao);
}每次用时都要这么写,不能封装,就是因为new BaseDao<UserPO, UserVO>();这部分不能封装,这样做很惨的...
哪位能指教一下有什么更好更简便的解决方案或实现...
我的理想是,使用这个dao时,只需要像
BaseDao userDao = new BaseDao<UserPO, UserVO>();
这样,就可以用它操作我想要操作的数据库对象(PO),用我想要的返回类型或参数(VO)
可惜我发现,这只是理想.java中的泛型实现是擦除式的,我不知道什么叫擦除式,只知道后果像getVOClass()方法中用反射不能获得当前类的泛型类型信息,而只能通过getGenericSuperclass()方法取得父类,求得父类的泛型类型信息,所以为了getVOClass()方法可用,我就必须用子类继承此BaseDao类,比如:
public class UserDao extends BaseDao<UserPO, UserVO>{}
而这样我又要每个po,vo对都做一个子类,如果项目中对应一个po,我需要有多个vo,比如有个UserQueryVO,也是对应的UserPO,那又要有一个
public class UserDao extends BaseDao<UserPO, UserQueryVO>{}
而不能像
public class UserDao<PO,VO> extends BaseDao<PO, VO>{}
这样用这样的需求很多,岂不是类爆炸?
并且,像我一开始所说,我想要的是一个通用的dao,所以这里我放弃了反射获得泛型类型,用了构造方法传入class
public BaseDao(Class poClass, Class voClass){
this.poClass = poClass;
this.voClass = voClass;
}
用的时候可以这样
BaseDao userDao = new BaseDao<UserPO, UserVO>(UserPO.class, UserVO.class);
没有理想中那么简洁,但也算凑合吧.毕竟这样可以解决问题[size=large]然后第二点[/size]
这个类的创建方式又难倒了我,按照上面所说的,我可以new一个BaseDao,可是我总不能每次db操作都new一个BaseDao对象吧.所以我考虑写个Factory,封装创建和缓存BaseDao对象,可是却没有办法写
因为java的泛型类型我没找到怎么动态指定,也就是说<>中的类定义不能动态.比如public BaseDao createDao(Class poClass, Class voClass) throws Exception{
return new BaseDao<poClass,voClass>(poClass, voClass);
}是不允许的我曾想过用spring注入,也google过资料,可是java语言本身都实现不了的东西,spring也没有办法现在的情况是,要么我每次数据库io都new一个BaseDao,要么用时到缓存去取,如果取不到的话再new一个,然后放到缓存中,如:BaseDao<UserPO, UserVO> userDao = DaoFactory.getDao(UserPO.class,UserVO.class);
if(null == userDao){
userDao = new BaseDao<UserPO, UserVO>(UserPO.class,UserVO.class);
DaoFactory.putDao(UserPO.class,UserVO.class, userDao);
}每次用时都要这么写,不能封装,就是因为new BaseDao<UserPO, UserVO>();这部分不能封装,这样做很惨的...
哪位能指教一下有什么更好更简便的解决方案或实现...
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货