在工作中遇到了調用Oracle存儲過程的有返回值的需求。記錄一下使用方法。
首先在百度搜索的方式in和out都封裝到一個map中。我這里的出參是對象中有兩個屬性一個是String一個是List,List里有N個對象。
public class MenudefController { @Autowired private MenudefMapper menudefMapper; public void test1(@RequestBody MenudefRequestVo enudefReqvo){ HashMap<String,String> map = new HashMap<>(); map.put("in_logonid",enudefReqvo.getIn_logonid()); map.put("in_menucode",enudefReqvo.getIn_menucode()); menudefMapper.queryMenudef1(map); } }
@Mapper public interface MenudefMapper { void queryMenudef1(HashMap map); }
@Data
public class MenudefRequestVo { private String in_logonid; private String in_menucode; }
<resultMap id="munuMap1" type="java.util.HashMap>
<result column="CMD_MENUCODE" property="CMD_MENUCODE"/>
<result column="CMD_PARENTMENU" property="CMD_PARENTMENU"/>
<result column="CMD_LEVEL" property="CMD_LEVEL"/>
<result column="CMD_ISLEAF" property="CMD_ISLEAF"/>
<result column="CMD_NAMECN" property="CMD_NAMECN"/>
<result column="CMD_NAMEEN" property="CMD_NAMEEN"/>
<result column="CMD_URL" property="CMD_URL"/>
<result column="CMD_TRANCODE" property="CMD_TRANCODE"/>
<result column="CMD_SEQNO" property="CMD_SEQNO"/>
<result column="CMD_GROUPVERSION" property="CMD_GROUPVERSION"/>
</resultMap>
<select id="queryMenudef1" statementType="CALLABLE" parameterType="java.util.HashMap"> {call co_pckg_initmenuinfo9.proc_queryrolemenuNEW( #{in_logonid,mode=IN,jdbcType=VARCHAR}, #{in_menucode,mode=IN,jdbcType=VARCHAR}, #{out_procsign,mode=OUT,jdbcType=VARCHAR}, #{ret_menuinfo,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,ResultMap=munuMap1} </select>
從返回的結果看,兩個out都被封裝到了map中,ret_menuinfo的value是集合,集合中又有map顯然是把屬性封裝到map的key,value中了。接下來我嘗試改變返回值先將List里的Map替換成對象。
@Data public class MenudefList { private String CMD_MENUCODE; private String CMD_PARENTMENU; private String CMD_LEVEL; private String CMD_ISLEAF; private String CMD_NAMECN; private String CMD_NAMEEN; private String CMD_URL; private String CMD_TRANCODE; private String CMD_SEQNO; private String CMD_GROUPVERSION; }
<resultMap id="munuMap1" type="com.bob.pym.user.vo.MenudefList">
<result column="CMD_MENUCODE" property="CMD_MENUCODE"/>
<result column="CMD_PARENTMENU" property="CMD_PARENTMENU"/>
<result column="CMD_LEVEL" property="CMD_LEVEL"/>
<result column="CMD_ISLEAF" property="CMD_ISLEAF"/>
<result column="CMD_NAMECN" property="CMD_NAMECN"/>
<result column="CMD_NAMEEN" property="CMD_NAMEEN"/>
<result column="CMD_URL" property="CMD_URL"/>
<result column="CMD_TRANCODE" property="CMD_TRANCODE"/>
<result column="CMD_SEQNO" property="CMD_SEQNO"/>
<result column="CMD_GROUPVERSION" property="CMD_GROUPVERSION"/>
</resultMap>
<select id="queryMenudef1" statementType="CALLABLE" parameterType="java.util.HashMap"> {call co_pckg_initmenuinfo9.proc_queryrolemenuNEW( #{in_logonid,mode=IN,jdbcType=VARCHAR}, #{in_menucode,mode=IN,jdbcType=VARCHAR}, #{out_procsign,mode=OUT,jdbcType=VARCHAR}, #{ret_menuinfo,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,ResultMap=munuMap1} </select>
現在ret_menuinfo這個key對應的value中是集合,集合里邊已經是MenudefList對象了。接下來將入參出參的map改為一個對象,也就是說入參和出參都封裝到一個對象中。
<resultMap id="munuMap1" type="com.bob.pym.user.vo.MenudefList">
<result column="CMD_MENUCODE" property="CMD_MENUCODE"/>
<result column="CMD_PARENTMENU" property="CMD_PARENTMENU"/>
<result column="CMD_LEVEL" property="CMD_LEVEL"/>
<result column="CMD_ISLEAF" property="CMD_ISLEAF"/>
<result column="CMD_NAMECN" property="CMD_NAMECN"/>
<result column="CMD_NAMEEN" property="CMD_NAMEEN"/>
<result column="CMD_URL" property="CMD_URL"/>
<result column="CMD_TRANCODE" property="CMD_TRANCODE"/>
<result column="CMD_SEQNO" property="CMD_SEQNO"/>
<result column="CMD_GROUPVERSION" property="CMD_GROUPVERSION"/>
</resultMap>
<select id="queryMenudef1" statementType="CALLABLE" parameterType="com.bob.pym.user.vo.MenudefAllArgs"> {call co_pckg_initmenuinfo9.proc_queryrolemenuNEW( #{in_logonid,mode=IN,jdbcType=VARCHAR}, #{in_menucode,mode=IN,jdbcType=VARCHAR}, #{out_procsign,mode=OUT,jdbcType=VARCHAR}, #{ret_menuinfo,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,ResultMap=munuMap1} </select>
@Data public class MenudefAllArgs { private String in_logonid; private String in_menucode; private String out_procsign; private List<MenudefList> menudefList; }
@Mapper public interface MenudefMapper { void queryMenudef1(MenudefAllArgs menudefAllArgs); }
public class MenudefController { @Autowired private MenudefMapper menudefMapper; public void test1(@RequestBody MenudefAllArgs menudefAllArgs){ menudefMapper.queryMenudef1(menudefAllArgs); } }
這個已經是我最后使用的方案,但我一直疑惑難道我不能把入參和出參拆成兩個對象嗎?這樣看起來很別扭。於是有了下邊這一版錯誤的方案。
@Data public class MenudefRequestVo { private String in_logonid; private String in_menucode; }
@Data public class MenudefResponseVo { private String out_procsign; private List<MenudefList> menudefList; }
public class MenudefController { @Autowired private MenudefMapper menudefMapper; public void test1(@RequestBody MenudefRequestVo menudefRequestVo){ menudefMapper.queryMenudef1(menudefRequestVo); } }
@Mapper public interface MenudefMapper { MenudefResponseVo queryMenudef1(MenudefRequestVo menudefRequestVo); }
<resultMap id="munuMap1" type="com.bob.pym.user.vo.MenudefList">
<result column="CMD_MENUCODE" property="CMD_MENUCODE"/>
<result column="CMD_PARENTMENU" property="CMD_PARENTMENU"/>
<result column="CMD_LEVEL" property="CMD_LEVEL"/>
<result column="CMD_ISLEAF" property="CMD_ISLEAF"/>
<result column="CMD_NAMECN" property="CMD_NAMECN"/>
<result column="CMD_NAMEEN" property="CMD_NAMEEN"/>
<result column="CMD_URL" property="CMD_URL"/>
<result column="CMD_TRANCODE" property="CMD_TRANCODE"/>
<result column="CMD_SEQNO" property="CMD_SEQNO"/>
<result column="CMD_GROUPVERSION" property="CMD_GROUPVERSION"/>
</resultMap>
<select id="queryMenudef1" statementType="CALLABLE" parameterType="com.bob.pym.user.vo.MenudefReqVo" resultType="com.bob.pym.user.vo.MenudefRespVo"> {call co_pckg_initmenuinfo9.proc_queryrolemenuNEW( #{in_logonid,mode=IN,jdbcType=VARCHAR}, #{in_menucode,mode=IN,jdbcType=VARCHAR}, #{out_procsign,mode=OUT,jdbcType=VARCHAR}, #{ret_menuinfo,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,ResultMap=munuMap1} </select>
但是最終報錯,錯誤原因是out的屬性在入參vo中找不到,拆分失敗。留下個疑問,難道in和out非要在一個對象中嗎?