mybatis学习(九)(调用存储过程(内含游标))

摘要:
resultMaptype=“部门”id=“CALL_1”>returnresult;}@Overridepublicbooleaneaquals(Objectobj){if(this==obj)returntrue;if(getClass();Deptother=(部门)obj;}elseif(;returntrue;this.dname=dname;this.loc=loc;

相信oracle的存储过程,大家都不陌生,有时候的确需要它来进行一些特殊的操作。当一个存储过程要返回一个大的数据集的时候,就需要游标在存储过程中使用。当查询结果出来后,又如何在mybatis中将这些数据注入到相应的对象中呢?在mybatis中要用到resultMap。

实例:运用储存过程输出dept表中的所有信息。

sql语句如下:

--创建一个包,在这个包中创建一种引用游标类型,该类型名为:t_cursor

 create or replace package test_pack
 as
 type t_cursor is ref cursor;
end test_pack;




--创建一个存储过程,该过程有一个出参,该参数的类型为刚刚创建包中的引用游标类型
create or replace procedure CU_DEPT_TEST(v_cursor out test_pack.t_cursor)
is
begin
     open  v_cursor for select * from dept;
 end;

接下来是mapper文件的配置,如下:

<!-- 调用储存过程(内含游标) -->
    
    <select id="callProcedure02" parameterType="map" statementType="CALLABLE">   
        {call CU_DEPT_TEST(#{v_cursor, mode=OUT, jdbcType=CURSOR, resultMap=CALL_1})}
     </select>
    
    <resultMap type="Dept" id="CALL_1">
        <id column="deptno" property="deptno"/>
        <result column="dname" property="dname"/>
        <result column="loc" property="loc"/>
    </resultMap>    
    

实体类如下:

mybatis学习(九)(调用存储过程(内含游标))第1张mybatis学习(九)(调用存储过程(内含游标))第2张
package com.yc.mybatis;

public class Dept {

    private int deptno;
    private String dname;
    private String loc;
    public int getDeptno() {
        return deptno;
    }
    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }
    public String getDname() {
        return dname;
    }
    public void setDname(String dname) {
        this.dname = dname;
    }
    public String getLoc() {
        return loc;
    }
    public void setLoc(String loc) {
        this.loc = loc;
    }
    @Override
    public String toString() {
        return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + deptno;
        result = prime * result + ((dname == null) ? 0 : dname.hashCode());
        result = prime * result + ((loc == null) ? 0 : loc.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Dept other = (Dept) obj;
        if (deptno != other.deptno)
            return false;
        if (dname == null) {
            if (other.dname != null)
                return false;
        } else if (!dname.equals(other.dname))
            return false;
        if (loc == null) {
            if (other.loc != null)
                return false;
        } else if (!loc.equals(other.loc))
            return false;
        return true;
    }
    public Dept(int deptno, String dname, String loc) {
        super();
        this.deptno = deptno;
        this.dname = dname;
        this.loc = loc;
    }
    public Dept() {
        super();
    }
    
    
    
    
}
Dept.java

测试类如下:

package com.yc.mybatis;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

public class TestTest01 {
    InputStream is = null;
    SqlSessionFactory factory = null;
    SqlSession session = null;
    {
        try {
            is = Resources.getResourceAsStream("mybatis-config.xml");
            factory = new SqlSessionFactoryBuilder().build(is);
            session = factory.openSession();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void TTest10(){
        Map<String, Dept> map = new HashMap<String, Dept>();
        map.put("v_cursor", new Dept());
        session.selectOne("TTest.callProcedure02", map);
        System.out.println(map);
    }
    
    
}

结果截图如下:

mybatis学习(九)(调用存储过程(内含游标))第3张

关于mybatis调用存储过程基本到此, 如果我的博客有不妥, 请各位欢迎评论。

免责声明:文章转载自《mybatis学习(九)(调用存储过程(内含游标))》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何在Ubuntu 20.04 Linux操作系统上安装Git出现 "System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本" 错误的解决办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue video.js使用技巧

1 初始化 Video.js初始化有两种方式。 1.1 标签方式 一种是在<video>标签里面加上class="video-js"和data-setup='{}'属性。 注意,两者缺一不可。 刚开始的时候我觉得后面的值为空对象{},不放也行, 导致播放器加载不出来,后来加上来就可以了。 1.2 JS方式 另外一种初始化 video.js 的方...

springboot中使用h2数据库(内存模式)

使用H2的优点,不需要装有服务端和客户端,在项目中包含一个jar即可,加上初始化的SQL就可以使用数据库了 在springboot中引入,我的版本是2.1.4,里面就包含有h2的版本控制 <!-- 集成h2数据库 --> <dependency> <groupId>c...

java跨域问题

javaWeb项目跨域问题解决方案:   1.简单的servlet项目 1.配置一个filter过滤器,过滤所有的请求,并且设置响应头 package Filter; import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOExcep...

WPF 冒泡路由事件

    在WPF中,例如,可以构建一个包含图形的按钮,创建一个具有文本和图片混合内容的标签,或者为了实现滚动或折叠的显示效果在一个特定的容器中放置内容。甚至可以多此重复嵌套,直到达到您所希望的层次深度。     这种可以任意嵌套的能力也带来了一个有趣的问题。例如,假设有一个标签,它包含一个StackPanel面板,该面板又包含了两块文本图像: <La...

非对称加密----加解密和数字签名

一、对称加密 对称加密:加密和解密使用相同密钥的加密算法。 对称加密的特点: 1)、速度快,通常在消息发送方需要加密大量数据时使用。 2)、密钥是控制加密及解密过程的指令。 3)、算法是一组规则,规定如何进行加密和解密。 典型应用场景:离线的大量数据加密(用于存储的) 常用的加密算法:DES、3DES、AES、TDEA、Blowfifish、RC2、RC...

Quartz 设置一个半小时任务实现

该文章属于本人原创,转载请注明出处。   spring + Quartz 设置定时任务时要求没一个半小时执行一次   设置两个相同的定时任务   第一个从整点开始每三小时执行一次              <!--每三小时执行一次任务,从整点开始-->        <propertyname="cronExpression"valu...