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;
	}

}

讲的很乱 希望能对碰到类似问题的同学有所帮助。。。

相关推荐