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的直接增删查改而没法做更多的业务逻辑?

10个回答

有啊。service主要就是做业务逻辑的。bean的增删不是在到层???

qq_18860653
爆裂码手 回复malie1981: 不也可以做个泛型基类,然后去继承基类service?
3 年多之前 回复
malie1981
malie1981 增删是在dao层,但是dao层是用泛型传入的,也就是不同的dao传入的泛型类型是不一样的。当用各个service的时候dao就不一样,而我希望在service的基类能做子类的service的通用的业务,比如传入子类的bean并做业务逻辑和赋值然后保存,这个怎么实现呢?
3 年多之前 回复

基类包括baseservice,basedao做泛型的增删查改,子类继承基类方法外,另外可以做自定义的业务逻辑,比如自定义获取数据,获取实体,自定义修改保存等

malie1981
malie1981 但是我想在基类中去做子类的通用业务,就像做一个抽象的service出来实现一些共用方法,但是父类中只能用basebean去传入,这样估计保存的时候就识别不出是哪个子类了。如果用泛型传入就没法操作赋值了,不能用t.set()这样的方法
3 年多之前 回复

Ibasedao(接口)-basedao(接口实现)
Ibaseservice(接口)-baseservice(采用basedao实现)
业务层Ixxxxservice(接口,继承Ibaseservice,并添加你要加的业务接口)--xxxxservice(继承baseservice,并实现你的业务接口,可以调用baseservice的增删改查)
其实在现实中为了方便使用我一般都会在抽出一个公用的业务seservice,把常用的数据字典操作,权限操作,日志啊什么的一股脑的放在里面,在控制层减少注入

gbguanbo
gbguanbo public <T> void saveStatus(Class<T> baseBean,String propertyName1,String status,String propertyName2,String remark);
3 年多之前 回复
gbguanbo
gbguanbo 在Ibaseservice中添加public <T> void saveStatus(T baseBean,String status,String remark);接口在baseservice中实现
3 年多之前 回复
gbguanbo
gbguanbo 回复malie1981: 在baseservice中添加public <T> void saveStatus(T baseBean,String status,String remark);
3 年多之前 回复
gbguanbo
gbguanbo 回复malie1981: 不同实体不会有一样的业务吧,如果有的话你只能用反射和泛型了
3 年多之前 回复
gbguanbo
gbguanbo 回复malie1981: 在公用的service中注入和公共业务有关的Ixxxxservice,使用这个处理业务,这个只能是比较常用的业务,要不然白写
3 年多之前 回复
malie1981
malie1981 我现在就是项抽出一个共用的service层,把一些通用的业务放在里面,但是子类要如何调用才能被识别是哪个子类调用的,因为我要用set()方法先赋值然后再保存,如果直接用泛型传的话就没法做这个操作了
3 年多之前 回复

并用反射和泛型,不知道能不能满足你的业务需要。

示例

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();
        }

}

第一次发言的T泛型被过滤了,你看最后一次的

想来想去还有一种方法,就是把实体名字当string传递过滤,用HQL执行或者传递表名,用sql处理,简单一点

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问