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

  • 相关阅读:
    《精通.NET互操作1.2》C# PInvoke使用c++dll
    WPF的dataGrid基本用法
    C#中$的用法
    ASP.NET WebApi 实现Token验证
    Ajax请求WebAPI传递多参数的方法
    ajax调用ASP.NET MVC控制器传递参数
    js子窗口调用父窗口函数并传递对象给父窗口的方法
    H5本地存储和本地数据库
    非对称加密RSA的C#实现
    在Unity3D项目中接入ShareSDK实现安卓平台微信分享功能(可使用ShareSDK默认UI或自定义UI)
  • 原文地址:https://www.cnblogs.com/1998xujinren/p/11229645.html
Copyright © 2011-2022 走看看