`
jamin415
  • 浏览: 3815 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

mybatis/hibernate 调用存储过程 返回游标 实例

    博客分类:
  • java
阅读更多
在网上找了很久的mybatis调用存储过程,并返回游标示例,例子很多,但是都描述不怎么清楚,通过多次探索,终于得出了得到完美的代码。希望对大家有一些帮助

存储过程示例:
create or replace procedure Fsp_Plan_CheckPrj(v_grantno  varchar2, v_deptcode number,  v_cursor   out sys_refcursor) is
………………
    ---返回统计结果
    open v_Cursor for
      select s.plan_code,
             s.plan_dept,
             s.plan_amount,
             s.exec_amount,
             p.cname       as plan_name,
             d.cname       as dept_name
        from Snap_plan_checkprj s
        left join v_plan p
          on s.plan_code = p.plan_code
        left join org_office d
          on s.plan_dept = d.off_org_code
       group by s.plan_code,
                s.plan_dept,
                s.plan_amount,
                s.exec_amount,
                p.cname,
                d.cname;
  end;
end Fsp_Plan_CheckPrj;


mybatis:(mybatis doc api:  http://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html#Result_Maps)
java层代码
Map<String, Object> params = new HashMap<String, Object>();
GrantSetting gs = this. grantSettingDao.get(grantCode);
params.put( "grantNo", StringUtils. substring(gs.getGrantNo(), 0, 2));
params.put( "offOrgCode", SecurityUtils.getPersonOffOrgCode());

params.put("v_cursor", new ArrayList<Map<String, Object>>());//传入一个jdbc游标,用于接收返回参数
this. batisDao. getSearchList("call_Fsp_Plan_CheckPrj", params);

return params;

mybatis xml配置

<resultMap type ="java.util.HashMap" id= "cursorMap"><!--配置返回游标中别名对应的resultMap -->
     <result column ="plan_code" property="plan_code" />
     <result column ="plan_dept" property="plan_dept"  />
     <result column ="plan_amount" property="plan_amount" />
     <result column ="exec_amount" property="exec_amount"  />
     <result column ="plan_name" property="plan_name" />
     <result column ="dept_name" property="dept_name" />
</resultMap >
<select id ="call_Fsp_Plan_CheckPrj" parameterType= "map" statementType="CALLABLE" >
                                                         <!--注明statementType="CALLABLE"表示调用存储过程-->
     {call Fsp_Plan_CheckPrj(#{grantNo, jdbcType=VARCHAR, mode=IN},
                                   #{offOrgCode, jdbcType=INTEGER, mode=IN},
     #{v_cursor, mode=OUT, jdbcType=CURSOR, resultMap=cursorMap})}
<!--传入传出参数要注明mode=IN/OUT 并要注明jdbcType(在网上可以查询mybatis支持哪些jdbcType类型),返回参数要注明对应的resultMap-->
</select >


最后,在jsp页面只需遍历
params.put( "v_cursor", OracleTypes. CURSOR);中的v_cursor。本身就是一个可遍历的list结果集


hibernate
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Connection con = this.getSession().connection();
CallableStatement sp;
try {
     sp = con.prepareCall("{call Fsp_Plan_CheckPrj(?,?,?)}");
     sp.setString(1, ObjectUtils.toString(params.get("grantNo")));
     sp.setLong(2, NumberUtils.toLong(ObjectUtils.toString(params.get("offOrgCode"))));
     sp.registerOutParameter(3, OracleTypes.CURSOR);
     sp.execute(); // 执行存储过程
     ResultSet rs = (ResultSet) sp.getObject(3); // 获取返回的对象,再将对象转为记录集  3代表哪个参数
     while (rs.next()) {
          Map<String, Object> resultMap = new HashMap<String, Object>();
          resultMap.put("plan_code", ObjectUtils.toString(rs.getObject(1)));
          resultMap.put("plan_dept", ObjectUtils.toString(rs.getObject(2)));
          resultMap.put("plan_amount", IrisStringUtils.FormatMoney(ObjectUtils.toString(rs.getObject(3))));
          resultMap.put("exec_amount", IrisStringUtils.FormatMoney(ObjectUtils.toString(rs.getObject(4))));
          resultMap.put("plan_name", ObjectUtils.toString(rs.getObject(5)));
          resultMap.put("dept_name", ObjectUtils.toString(rs.getObject(6)));
          list.add(resultMap);
     }
} catch (SQLException e) {
     e.printStackTrace();
}
return list;





















分享到:
评论
2 楼 t13523417 2014-08-20  
能不能把java部分的所有代码都给我贴一下呀,谢谢了。
1 楼 t13523417 2014-08-20  
params.put( "v_cursor", OracleTypes. CURSOR);中的v_cursor。本身就是一个可遍历的list结果集

这句话怎么解释的啊???跟上面那句冲突???

相关推荐

Global site tag (gtag.js) - Google Analytics