MyBatis调用Oracle的存储过程

您所在的位置:网站首页 mybatis如何执行存储过程 MyBatis调用Oracle的存储过程

MyBatis调用Oracle的存储过程

2024-05-19 02:11| 来源: 网络整理| 查看: 265

一、传入与输出都是单值参数

存储过程定义:

create or replace procedure pro_test1(param1 in number, param2 in number, param3 out number) is begin param3:=param1+param2; end pro_test1;

DAO

void testProcedure2(Map map);

MyBatis 

{call pro_test1(#{v_p1, mode=IN, jdbcType=INTEGER}, #{v_p2, mode=IN, jdbcType=INTEGER}, #{v_p3, mode=OUT,jdbcType=INTEGER})}

注意这里的 mode=IN, jdbcType=INTEGER ,两个属性是必须的,且值要大写否则会出错。jdbcType与数据库数据类型的对应关系在文末有链接。

 

测试

@Test public void test2(){ Map map = new HashMap(); map.put("v_p1", 1); map.put("v_p2", 2); bookCategoryDao.testProcedure2(map); System.out.println(map); }//输出-----

  {v_p3=3, v_p2=2, v_p1=1}  class java.lang.Integer

调用存储过程的参数要放在Map中,入参指定好key、value,出参不用指定,在MyBatis的mapper文件中 #{v_p3, mode=OUT,jdbcType=INTEGER}   v_p3会作为出参的key放入Map中,值为存储过程返回值。

 

 

二、输出结果集

存储过程定义:

create or replace procedure pre_test(v_cursor out sys_refcursor) is begin open v_cursor for select * from t_book_category; end pre_test;

sys_refcursor 是用于返回结果集的游标

 

DAO

void testProcedure1(Map map);

 

MyBatis

{call pre_test(#{result, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=hMap})}

javaType=ResultSet ,resultMap=hMap两个参数是返回结果集必须的如果没有javaType=ResultSet会引起类型转换异常:

  java.lang.ClassCastException: oracle.jdbc.driver.OracleResultSetImpl cannot be cast to java.util.List

resultMap=hMap 指定结果集的每条的封装规则;每一条就是数据表的一条记录,除了用Map接收还能用指定pojo对象接收。

 

 

测试

@Test public void test1(){ Map map = new HashMap(); bookCategoryDao.testProcedure1(map); Object o = map.get("result"); System.out.println(o); System.out.println(o.getClass()); List l = (List) o; System.out.println(l.get(0).getClass()); }

输出

 

附一个MyBatis的jdbcType与Oracle、MySql的数据类型对应关系:https://www.cnblogs.com/yadongliang/p/7739303.html

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3