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至关重要,要是不写,会导致返回的集合不知道生成什么实体类。