Mybatis调用存储过程,通过sys_refcursor获取对象集合

1.数据库写法

 PROCEDURE selectRoleMenu(cdbhs OUT SYS_REFCURSOR,
                           jsjb  in varchar2,
                           sjjs  in varchar2,
                           M_RES OUT INTEGER,
                           M_ERR OUT VARCHAR2) is
BEGIN
...
END;

2.Dao层写法

void selectUserMenu(@Param("map")Map<String,Object> map);

3.Service层

	public void selectUserMenu(List<FrmMenu> menus, FrmSysUser user) {
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("menus",new ArrayList<FrmMenu>());
		map.put("yhdh",user.getYhdh());
		map.put("code",user.getCode());
		map.put("mess",user.getMess());
		frmMenuDao.selectUserMenu(map);
		if(map!=null){
			//1.这样写是错误的,导致引用改变,不能改变全局变量的数据
			menus = (List<FrmMenu>)map.get("menus");
			//2.正确操作
			menus.clear();
			menus.addAll((List<FrmMenu>)map.get("menus"));
		}
	}

4.Mybatis配置文件

(1)调用存储过程
	<select id="selectUserMenu" statementType="CALLABLE" parameterType="map">
    	{call FRM_DATA_PKG.selectUserMenu(#{menus,mode=OUT,jdbcType=CURSOR,javaType=ResultSet,resultMap=cursorMap},#{yhdh,mode=IN,jdbcType=VARCHAR},#{code,mode=OUT,jdbcType=INTEGER},#{mess,mode=OUT,jdbcType=VARCHAR})}
    </select>
(2)resultMap
	<resultMap type="com.zlkj.frm.bean.FrmMenu" id="cursorMap">
		<result property="mlbh" column="mlbh" jdbcType="VARCHAR"/>
		<result property="cdbh" column="cdbh" jdbcType="VARCHAR"/>
    	<result property="cdmc" column="cdmc" jdbcType="VARCHAR"/>
    	<result property="ymdz" column="ymdz" jdbcType="VARCHAR"/>
    	<result property="cdtp" column="cdtp" jdbcType="VARCHAR"/>
	</resultMap>

其中resultMap=cursorMap至关重要,要是不写,会导致返回的集合不知道生成什么实体类。

猜你喜欢

转载自blog.csdn.net/qq_35275077/article/details/83348396