mybatis3调用oracle存储过程
今天用到了mybatis3 调用oracle的存储过程,这存储过程仅负责查询数据和返回查询结果
oracle的存储过程,如果要查询数据必须有一个游标供使用
先看下简单的存储过程
CREATE OR REPLACE PROCEDURE zdrqlx_PROC ( V_TEMP OUT zdrqlxPackage.zdrqlx_cursor ) AS BEGIN OPEN V_TEMP FOR SELECT LXMC FROM TBGW_ZHDRQFL ; END zdrqlx_PROC;
这个存储过程查询后 结果是 一列数据 列名 LXMC
下面贴查询mybatis的配置
<resultMap id="teshurenqunMap" type="bean.admin.menus.ZhongDianRenQunBean" > <result column="lxmc" property="lxmc" /> </resultMap> <select id="selectByMap" parameterType="map" statementType="CALLABLE" > { call zdrqlx_PROC(#{listinfo,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,resultMap=teshurenqunMap})} </select>
程序调用的是selectByMap 这个方法 在调用的时候 需要传入一个参数 这里参数名是map ,map内可以什么属性都没有, 在mybatis调用存储过程后,会把数据 回塞给这个map
所以 如果你的程序是 Map resultmap = dao.selectByMap(map);
然后去读取resultmap ,结果会是null的 什么都没有,而数据实际上在被存在参数的map里面 而不是resultmap (map 是参数map,resultmap 是返回接收的) 这点很重要,我被卡住了半天!!!
下面是调用 看了上面一段话 下面的程序一目了然
Map map = new HashMap(); menusService.getToolsBarMunus(map);//这里调用selectByMap map.put("success", true); //这边数据会存在这个参数map里,是被回填的了 datas.append(com.alibaba.fastjson.JSON.toJSONString(map));
com.alibaba.fastjson.JSON.toJSONString(map)
这句话是用的json组件转化map得到string,结果是下面的
{"listinfo":[{"lxmc":"张三"},{"lxmc":"李四"},{"lxmc":"王五"}{"lxmc":"赵六"}]}
根据结果,反过来看调用存储过程
{ call zdrqlx_PROC(#{listinfo,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,resultMap=teshurenqunMap})}
1. listinfo 这个是第一个参数,我是随意写的,不和任何东西管理,看下上面json转化后的map结果就明白了
2 mode=OUT 声明此参数作为输出类型
3 jdbcType=CURSOR 说明他是游标 因为这个存储过程主要是查询,需要传入一个游标参数,不信的话你在plsql里面test存储过程 看下面就明白了
4 javaType=java.sql.ResultSet, 貌似固定要求这样,求大神解答
5 resultMap 必须有这个参数 我这里配置的 是resultMap id="teshurenqunMap" 对应的
最后是我的bean 也就是resultMap 设置的type=
package bean.admin.menus; import java.util.List; public class ZhongDianRenQunBean { private String lxmc; public String getLxmc() { return lxmc; } public void setLxmc(String lxmc) { this.lxmc = lxmc; } }
讲的很乱 希望能对碰到类似问题的同学有所帮助。。。