由Java调用存储过程编写引发的思考

由Java掉存储过程的代码并不复杂。但要完成一种调用机制时,会遇到一个相对棘手的问题。

比如,我希望调用存储过程时,能有一个接口,提供两个重载方法。(设计阶段)

void runSp(Dbstr dbstr, String spname, String p_result);
void runSp(Dbstr dbstr, String spname, String p_result, DataTable dt);

Dbstr用于映射不同的数据库连接,spname指定存储过程名称,p_result获取存储过程运行结果的信息。(当然参数列表中可能还缺少作为SP参数的Map信息)。

此时,p_result所能获取到的是值类型的数据,而非引用类型的数据,所以,在实现这个接口的类中,并不能实现这个运行机制。

此时baidu/google/bing大约1个小时。发现问题的症结不是在于JAVA没有提供类似.net中的ref或者out关键字,而是,你懂的。

简单的说,是参数列表中,可以接收引用类型的数据,可能只有类的对象,而类似int, String, double...都不是对象,都是值类型的数据。所以,我很自然的想到了.net中的boxing与unboxing(装箱拆箱),但是这件事情,在做.net编程的时候,都是系统帮忙完成,你写

(123).ToString();

在.net中是合法的,因为系统会自动装箱。但是你要在java里面写这样的代码,是不能编译通过的。

回到我要实现的运行模式中,要实现这两个接口,估计只能用,

void runSp(Dbstr dbstr, String spname, BString p_result);
void runSp(Dbstr dbstr, String spname, BString p_result, DataTable dt);

 而BString的作用就是装箱:

public class BString {
    
private String value;

    
public String getValue() {
        
return value;
    }

    
public void setValue(String value) {
        
this.value = value;
    }
}

这样,对于.net与java的联系,又多了一些。

原文地址:https://www.cnblogs.com/rain64531264/p/2153431.html