java的业务层基类代码能写除了保存查询外的其他业务逻辑吗?

比如我希望在基类中写一个传入值然后赋值给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泛型被过滤了,你看最后一次的

大哥,用静态工厂方法代替构造函数啊,懂我意思没?