ITPub博客

首页 > 应用开发 > IT综合 > Mybatis中处理oracle返回游标类型的自定义函数

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

原创 IT综合 作者:oracle0215 时间:2016-08-03 22:47:16 0 删除 编辑
     在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博客 ” ,链接:https://blog.itpub.net/30741760/viewspace-2122950/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-12-24

  • 博文量
    7
  • 访问量
    22245