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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在 MyBatis 的 SQL 语句使用自定义函数,可以按照以下步骤操作: 1. 在 MyBatis 的配置文件,添加自定义函数的定义。例如,如果你想添加一个名为 "myfunction" 的函数,可以这样写: ```xml <configuration> <typeAliases> <!-- type aliases --> </typeAliases> <plugins> <!-- plugins --> </plugins> <typeHandlers> <!-- type handlers --> </typeHandlers> <objectFactory type="..."> <!-- object factory config --> </objectFactory> <settings> <!-- settings --> </settings> <environments default="..."> <!-- environments --> </environments> <databaseIdProvider type="..."> <!-- databaseIdProvider config --> </databaseIdProvider> <mappers> <!-- mappers --> </mappers> <functions> <function name="myfunction" class="com.example.MyFunctionClass" /> </functions> </configuration> ``` 2. 在你的 SQL 语句使用自定义函数。例如,如果你的自定义函数需要两个参数,可以这样写: ```xml SELECT * FROM users WHERE age > ${myfunction(param1, param2)} ``` 注意,这里的 `${myfunction(param1, param2)}` 的 `myfunction` 就是你在第一步定义的函数名。 3. 编写自定义函数的代码。在上面的例子,`com.example.MyFunctionClass` 就是你需要编写的自定义函数的类。这个类需要实现 `org.apache.ibatis.scripting.xmltags.ExpressionEvaluator` 接口,并实现 `evaluate(String expression, Object parameterObject)` 方法来计算函数的返回值。例如: ```java public class MyFunctionClass implements ExpressionEvaluator { public Object evaluate(String expression, Object parameterObject) { // 解析 expression,使用 parameterObject 计算函数的返回值 } } ``` 这样,就可以在 MyBatis 的 SQL 语句使用自定义函数了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值