在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,表示是调用过程或函数。
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/