由Java掉存储过程的代码并不复杂。但要完成一种调用机制时,会遇到一个相对棘手的问题。
比如,我希望调用存储过程时,能有一个接口,提供两个重载方法。(设计阶段)
void runSp(Dbstr dbstr, String spname, String p_result);
void runSp(Dbstr dbstr, String spname, String p_result, DataTable dt);
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);
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;
}
}
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
这样,对于.net与java的联系,又多了一些。