Mybatis中处理oracle返回游标类型的自定义函数

     在java中接受PL/SQL函数返回的结果集用resultset,但是现在项目中很少使用这种底层机制了,之前大部分的代码编写都是纯PL/SQL,对于java如何接收函数返回的游标一直很好奇,刚好新项目用上Mybatis就小小的研究一下(使用springmvc,mybatis)。 部分代码如下:
oracle 函数:
create or replace function f_get_emp(pname varchar2) return sys_refcursor
is
  l_cur sys_refcursor;
begin
  open l_cur for select empno, ename, mgr from emp where ename like '%'||pname||'%';
  return l_cur;   ----返回游标
end;

java 代码:
dao层:
public interface ScottMapper {
    public List<Scott> findItemsList(HashMap<String,Object> statMap) throws Exception;
}

service层:
public class ItemsServiceImpl implements ItemsService {

    @Autowired
    private ScottMapper scottMapper;
    
    @Override
    public List<Scott> findItemsList(String pname) throws Exception {
        List<Scott>  scottlist = new ArrayList<Scott>();                 //结果相当于记录的集合,可以使用List来接收
        HashMap<String,Object> statMap = new HashMap<String,Object>();
        statMap.put("pname", pname);         //ORACLE函数的参数
        statMap.put("result", scottlist);         //结果集
        scottMapper.findItemsList(statMap);
        
        scottlist = (List<Scott>)statMap.get("result");    //获取结果
        return scottlist;
    }
}

POJO:
public class Scott {
    int empno;
    String ename;
    int mgr;
   ...(geter and setter)
}
控制层:
    @RequestMapping("/queryItems")
    public ModelAndView queryScotts(HttpServletRequest request, String pname) throws Exception {

        List<Scott> scottList = itemsService.findItemsList(pname);

        ModelAndView modelAndView = new ModelAndView();
        
        modelAndView.addObject("scottList", scottList);

        modelAndView.setViewName("items/scottList");

        return modelAndView;
    }

映射文件:
     <resultMap id="ScottData" type="Scott">    
        <id  column="empno"   property="empno" />    ---主键
        <result column="ename"   property="ename"/>
        <result column="mgr"   property="mgr"/>           
    </resultMap>
     
 
    <select id="findItemsList" parameterType="HashMap" statementType="CALLABLE">   
         {#{result,mode=OUT,jdbcType=CURSOR,resultMap=ScottData} =  call f_get_emp(#{pname,jdbcType=VARCHAR,mode=IN}) }
    </select>

上面代码参数如何专递就不说了,是框架的问题,关键点是在写映射文件的时候,如果是调用函数,则<resultMap>必须使用(报了多次错误才发现). 另外select 标签
必须有statementType属性,并且值为CALLABLE,表示是调用过程或函数。




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30741760/viewspace-2122950/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30741760/viewspace-2122950/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值