需要一次操作多张表的情况下,为了简化代码,可以直接调用一个存储过程
调用存储过程有很多方法
1,最原始的jdbc调用
2,用mybatis,hibernate等框架调用(推荐,简单)
http://blog.csdn.net/rishengcsdn/article/details/41957567(返回字符串,返回结果集,批量插入)
调用存储过程,注入参数的类型
StringBuffer inPara = new StringBuffer();
inPara.append("CUSTOMER_KEY=");
inPara.append(Integer.parseInt(tbCusFirmChg.getCustomerKey().toString()));
inPara.append('\r');
inPara.append('\n');
inPara.append("WARE_LISTS=");
inPara.append(pzList);
inPara.append('\r');
inPara.append('\n');
param.put("inPara", inPara.toString());///////这里需要转化成string,要不然会某个参数类型不匹配,JDBCTYPE
param.put("result", "");
String ret2=tbCusFirmChgService.getpro(param);
<select id="getpro" parameterType="map" statementType="CALLABLE" resultType="string">
<![CDATA[
{call PD_CUS_CHGWARE(#{inPara,mode=IN,jdbcType=VARCHAR},#{result,mode=OUT,jdbcType=VARCHAR})}
]]>
</select>
注意的地方是,虽然存储过程有返回值(ret2),但是返回值很诡异,不可以使用。一般都是用 map.put("retStr", "");输出参数来使用自定义的返回值。
调试存储过程,看参数很重要 例如下面的 CUSTOMER_KEY=417这个才是参数而不是417
{result=, inPara=CUSTOMER_KEY=417}
{call PD_LOGOUTCUST(?,?)}
Parameters: CUSTOMER_KEY=417(String)