比如我希望在基类中写一个传入值然后赋值给bean并保存,比如saveStatus(BaseBean baseBean,String status,String remark),然后用baseBean.setstatus(status)跟baseBean.remark(remark)保存传值,然后调用dao保存到数据库,但是因为dao的保存是通过泛型传入的,所以无法识别BaseBean类,比如在basedao里定义了一个抽象getBasedao的方法,各子类实现他,然后保存是用类似传入的getBasedao.insert(T)这样的方法。不知道怎么设计才能实现这样的功能?因为每个service子类都有这样的方法,唯一不同的不过是传入的bean和用到的dao,如何能抽取出这个方法到父类中呢?是不是service的基类只能做bean的直接增删查改而没法做更多的业务逻辑?
有啊。service主要就是做业务逻辑的。bean的增删不是在到层???
基类包括baseservice,basedao做泛型的增删查改,子类继承基类方法外,另外可以做自定义的业务逻辑,比如自定义获取数据,获取实体,自定义修改保存等
Ibasedao(接口)-basedao(接口实现)
Ibaseservice(接口)-baseservice(采用basedao实现)
业务层Ixxxxservice(接口,继承Ibaseservice,并添加你要加的业务接口)--xxxxservice(继承baseservice,并实现你的业务接口,可以调用baseservice的增删改查)
其实在现实中为了方便使用我一般都会在抽出一个公用的业务seservice,把常用的数据字典操作,权限操作,日志啊什么的一股脑的放在里面,在控制层减少注入
并用反射和泛型,不知道能不能满足你的业务需要。
示例
A.java
public class A {
public void doPrint(){
System.out.println("in A class");
}
}
B.java
public class B {
public void doPrint(){
System.out.println("in B class");
}
}
MAIN.java
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MAIN {
public static <T> void main(String[] args) {
A clazzA = new A();
B clazzB = new B();
MAIN clazzMain = new MAIN();
// 测试
clazzMain.doPrint(clazzA);
clazzMain.doPrint(clazzB);
}
public <T> void doPrint(T t) {
try {
Method method = t.getClass().getMethod("doPrint");
method.invoke(t);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
}
}
补充,
输出结果为
in A class
in B class
public void saveStatus(Class baseBean,String propertyName1,String status,String propertyName2,String remark);
实现
@Override
public void saveStatus(Class baseBean,String propertyName1,String status,String propertyName2,String remark) {
// TODO Auto-generated method stub
try {
PropertyDescriptor pd = new PropertyDescriptor(propertyName1,
baseBean);
Method writeMethod = pd.getWriteMethod();// 获得set方法
Object ob = writeMethod.invoke(status);
PropertyDescriptor pd2 = new PropertyDescriptor(propertyName2,
(Class) ob);
Method writeMethod2 = pd2.getWriteMethod();// 获得set方法
ob = writeMethod2.invoke(status);
//调用保存方法
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
你试试吧,没测试过
@Override
public <T> void saveStatus(Class<T> baseBean,String propertyName1,String status,String propertyName2,String remark) {
// TODO Auto-generated method stub
try {
PropertyDescriptor pd = new PropertyDescriptor(propertyName1,
baseBean);
Method writeMethod = pd.getWriteMethod();// 获得set方法
Object ob = writeMethod.invoke(status);
PropertyDescriptor pd2 = new PropertyDescriptor(propertyName2,
(Class<T>) ob);
Method writeMethod2 = pd2.getWriteMethod();// 获得set方法
ob = writeMethod2.invoke(status);
//调用保存方法
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
想来想去还有一种方法,就是把实体名字当string传递过滤,用HQL执行或者传递表名,用sql处理,简单一点
第一次发言的T泛型被过滤了,你看最后一次的
大哥,用静态工厂方法代替构造函数啊,懂我意思没?