数据库存储过程的后端调用(SQLServer)
项目中使用到了SQL Server的存储过程,其位于可编程性-存储过程,详细如下。
其内需要四个入参,为表名,列名,左固定值,剩下右边的长度。
本项目中需要生成10位验收单编号,其中前六位为年+月,后四位为表中没有的最小码。则入参:Sell_ysqk(表名),ysdbh(列名),year+month:如202410(左固定值),4(右剩余长度)。
在后端Mybatis中使用存储过程,此中用一种常用的HashMap的方式:
Mapper.xml中通过 call 存储过程名 调用。
{call getMinSerial_withLeft(#{tableName}, #{columnName}, #{left}, #{rightLength})}
入参为HashMap,出参为String。(入参不知道是什么往往写map就行)
<select id="getYsdbh" parameterType="java.util.HashMap" statementType="CALLABLE" resultType="String">
{call getMinSerial_withLeft(#{tableName}, #{columnName}, #{left}, {rightLength})}
</select>
在serviceImpl中,如下传参并接收返回值即可。
HashMap<String,Object> map=new HashMap<>();
map.put("tableName","Sell_ysqk");
map.put("columnName","ysdbh");
map.put("left",year+""+month);
map.put("rightLength",4); //Map中据入参名放好相应参数。
String ysdbh = mapper.getYsdbh(map);//将map传入方法,定义一个String来直接接收。
如果是有出参的,或者参数类型不同。xml中需要以mode,javatype注明。
{ call pro_yjjs_xmxx
(#{nd, mode=IN, jdbcType=VARCHAR}, #{jd, mode=IN, jdbcType=VARCHAR}, #{htjzrq, mode=IN, jdbcType=VARCHAR}, #{kssj, mode=IN, jdbcType=VARCHAR}, #{jssj, mode=IN, jdbcType=VARCHAR}, #{zxjg, mode=OUT, jdbcType=VARCHAR}) }
在ServiceImpl中,put后要先调用完存储过程,出参已存储至map中,此时再get出参即可获取。
paramsMap.put("nd", nd);
paramsMap.put("jd", jd);
paramsMap.put("htjzrq", htjzrq);
paramsMap.put("kssj", ksJsDate.get("kssj"));
paramsMap.put("jssj", ksJsDate.get("jssj"));
yjjsMapper.clearUpTempXmyjjs(paramsMap);
String zxjg= paramsMap.get("zxjg")