zoukankan      html  css  js  c++  java
  • mybatis学习(九)(调用存储过程(内含游标))

    相信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>    
        

    实体类如下:

    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调用存储过程基本到此, 如果我的博客有不妥, 请各位欢迎评论。

  • 相关阅读:
    通过Javascript调用微软认知服务情感检测接口的两种实现方式
    Microsoft Flow 概览
    使用PowerApps快速构建基于主题的轻业务应用 —— 进阶篇
    从三个语言(C++,Java,C#)的几个性能测试案例来看性能优化
    自己动手,打造轻量级VSCode/C#环境代替LinqPad
    2015年总结
    将知识变成你的技能点
    瞎子摸象与刻舟求剑
    俺的追求,下一个五年的指导纲领
    工作中任务管理的四个原则和四个技能
  • 原文地址:https://www.cnblogs.com/1998xujinren/p/11229645.html
Copyright © 2011-2022 走看看