存储过程在小公司用的不多,但是如果业务比较复杂或者性能要求比较苛刻的时候存储过程就派上用场了,ibatis的前期的一些版本貌似不支持存储过程因此我选择了mybatis来做实验。

1.无输入和输出参数的存储过程,我写了一个比较简单的,需要注意的是Oracle无参存储过程不能写括号

CREATE OR REPLACE Procedure cascadeoperation
As
Begin
Delete From teacher Where id=1;
Update studentdetail Set address='宁波市海曙区' Where studentid=10;
End;

这里执行了2个操作,可能用过mybatis的人会迷惑执行的时候到底使用update标签呢还是delete标签,其实都行,我也试过select标签也是OK的,下面是部分的配置文件

2.带有输入和输出参数的存储过程,我这里加入了if else的几个判断

CREATE OR REPLACE Procedure queryTeacher(fid In Integer,Type In Varchar,Name Out Varchar)
As
Begin
If Type='' then
Select Name Into Name From student Where id=fid;
Else if Type='' Then
Select Name Into Name From teacher Where id=fid;
Else
Name:='错误';
End If;
End If;
End;

下面顺便把我在命令行窗口执行的存储过程语句贴出来

Declare
Name Varchar2(50);
Begin
queryteacher(3,'',Name);
DBMS_OUTPUT.put_line(Name);
End;
/

执行过类似语句的时候可能看不到任何的输出,不要着急只需在命令行使用set serveroutput on;即可来看下我的执行结果

看到结果了吧,下面使用mybatis来执行这个存储过程,下面是映射文件的写法

<select id="queryTeacher" statementType="CALLABLE" parameterType="java.util.Map">
{call queryTeacher(#{fid,mode=IN,jdbcType=INTEGER},#{type,mode=IN,jdbcType=VARCHAR},#{name,mode=OUT,jdbcType=VARCHAR})}
</select>

那怎么取得返回的内容呢,其实只要存储过程执行后map里就有值了,java代码大致如下

Map<String,Object> mm=new HashMap<String,Object>();
mm.put("fid", 3);
mm.put("type", 2);
m.queryTeacher(mm);
System.out.println(mm.get("name"));

下面是控制台输出的结果

3.还有一种存储过程,它可以返回一个游标就类似一个集合这种

CREATE OR REPLACE Procedure getTeacher(cur_arg out Sys_Refcursor)
As
begin
open cur_arg for Select * From teacher;
End;

这种情况,在mybatis里就稍微有些不同了,此时jdbcType就是CURSOR,javaType则是ResultSet了,这里还可以把结果转成resultMap了,如下所示

<resultMap id="resultMap3" type="org.lxh.module.usefunction.info.Teacher">
<result property="address" column="address"/>
<result property="name" column="name"/>
<result property="id" column="id"/>
</resultMap> <select id="getAllTeacherInfo" statementType="CALLABLE" parameterType="java.util.Map" >
{call GETTEACHER(#{result,jdbcType=CURSOR,mode=OUT,javaType=ResultSet, resultMap=resultMap3})}
</select>

这里的话Java代码就稍微复杂一些

Map<String, Object> map = new HashMap<String, Object>();
m.getAllTeacher(map);
Set<Map.Entry<String, Object>> set = map.entrySet();
for (Iterator<Map.Entry<String, Object>> it = set.iterator(); it
.hasNext();) {
Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it
.next();
// System.out.println(entry.getKey() + "--->" +
// (Teacher)entry.getValue());
List<Teacher> t = (List<Teacher>) entry.getValue();
Iterator<Teacher> itera = t.iterator();
while (itera.hasNext()) {
Teacher tt = itera.next();
System.out.println(tt.getName() + "," + tt.getAddress());
} }

下面是执行结果

到这里存储过程已经差不多了,研究了好久才弄出来,其他的用jdbc执行存储过程我随后会把文章添上来。

返回游标也可以直接用下面的方法

Map map = new HashMap();
map.put("jid", jid);
userInfoMapper.getFriendList(map);
//result 为在mybatis xml文件时 写的返回结果名
List<UserInfo> list = (List<UserInfo>)map.get("result");
return list;

本文转自:http://my.oschina.net/lujianing/blog/296427

使用mybatis执行oracle存储过程的更多相关文章

  1. MyBatis调用Oracle存储过程

    MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...

  2. Crontab定时执行Oracle存储过程

    Crontab定时执行Oracle存储过程 需求描述 我们有一个Oracle的存储过程,里面是每个月需要执行一下,生成报表,然后发送给业务部门,这一个功能我们有实现在系统的前台界面(如图1-1),但是 ...

  3. springboot+mybatis调用oracle存储过程

    1 存储过程参数为VARCHAR 代码逻辑:controller层定义实体类对象entity,并entity.set给存储过程的输入参数赋值,把赋值后的实体类通过service层传到dao层,然后通过 ...

  4. mybatis 调用 oracle 存储过程 select into 无记录时NO_DATA_FOUND异常处理分析

    首先根据这篇文章:http://www.cnblogs.com/coolzdp/p/7717332.html 我们知道存储过程中 SELECT * INTO 如果没有记录是不会往下执行的,直接抛出NO ...

  5. C# WINFORM 窗体执行ORACLE存储过程 进行增删改查 自己编写借助网络(二)

    窗体界面: 下面是项目二的代码 本代码我是留着备份学习的 以供参考: 存储过程: 存储过程: 插入数据:CREATE OR REPLACE Procedure p_insert_t_cls --存储过 ...

  6. 执行Oracle存储过程报权限不足的解决方法

    当前Oracle用户sofa拥有connect.dba.resource的角色权限,但奇怪的是却没有执行Oracle Procedure的权限.后来通过查找资料发现:如果sofa用户需要执行Proce ...

  7. mybatis调用oracle存储过程的几个参考例子

    首先写一个存储过程: create or replace procedure p_syn_equipment_20161205 is sqlstr ); begin --清空表 sqlstr := ' ...

  8. mybatis 调用oracle存储过程如何返回out参数值

    调试了半天,其实整体用map传入传出也挺简单, 主要是调用存储过程 select标签里平时习惯不写 statementType="CALLABLE",调用没有out参数时也能正常用 ...

  9. mybatis调用oracle存储过程例子.

    1.MYBATIS方法: <select id="getFlowNum" statementType="CALLABLE"> <![CDATA ...

随机推荐

  1. codeforces 483C.Diverse Permutation 解题报告

    题目链接:http://codeforces.com/problemset/problem/483/C 题目意思:给出 n 和 k,要求输出一个含有 n 个数的排列 p1, p2, ...,pn,使得 ...

  2. Servlet、JSP选择题

    Java EE软件工程师认证考试 试题库-选择题   一.    选择题(包括单选和双选) 1.A 对于B/S架构的工作流程,以下说法正确的是(   )(选择一项) A. 浏览器接受用户的输入--&g ...

  3. Redhat修改主机名_Red hat怎么永久修改主机名hostname(转)

    有几种方式修改Redhat的主机名字,这些方法也适合其他的Centos系统,下面介绍Red hat怎么永久修改主机名hostname的三种方法. 方法一: 说明"hostname" ...

  4. 安装memcached服务器和PHP中添加memcache拓展模块

    Memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提拱动态 数据驱动网站的速度. memcached ...

  5. 蓝牙4.0——Android BLE开发官方文档翻译

    ble4.0开发整理资料_百度文库 http://wenku.baidu.com/link?url=ZYix8_obOT37JUQyFv-t9Y0Sv7SPCIfmc5QwjW-aifxA8WJ4iW ...

  6. ytu 2011: C语言实验——找中间数(水题)

    2011: C语言实验——找中间数 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 212  Solved: 122[Submit][Status][Web ...

  7. ASP.NET Web.Config 读写辅助类

    using System; using System.Configuration; using System.Web; using System.Web.Configuration; namespac ...

  8. c语言 struct 的初始化

    转自:http://www.cnblogs.com/silentjesse/archive/2013/07/30/3225212.html struct数据有3中初始化方法:顺序,C风格及C++风格的 ...

  9. oracle怎么卸载(转)

    Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.到目前仍在数据库市场上占有主要份额.劳伦斯·埃里森和他的朋友,之前的同事 Bob ...

  10. 修改ViewPager调用setCurrentItem时,滑屏的速度

    原文摘自: 修改ViewPager调用setCurrentItem时,滑屏的速度 在使用ViewPager的过程中,有需要直接跳转到某一个页面的情况,这个时候就需要用到ViewPager的setCur ...