MyBatis调用Oracle的存储过程 |
您所在的位置:网站首页 › mybatis如何执行存储过程 › MyBatis调用Oracle的存储过程 |
一、传入与输出都是单值参数 存储过程定义: 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 |