zoukankan      html  css  js  c++  java
  • MyBatis中调用存储过程和函数

    一.调用存储过程

       1.首先在数据库中定义存储过程,定义的存储过程的代码如下:

      

    //定义存储过程
    create or replace procedure pag_add(p1 varchar2,p2 varchar2,p3 out varchar2) as begin p3:=p1+p2; end;

    //定义函数

    create or replace function fun_add(p1 number ,p2 number)
      return number
      as
    begin
        return p1+p2;
    end;

     

        2.通过接口映射Sql,定义接口

    package cn.et.mybatis.lesson02.func;
    
    import java.util.List;
    import java.util.Map;
    
    public interface CallMapper {
    //    public void queryEmp(Map map);
            //查询存储过程的方法
            public void callProcedure(Map map);
            //查询函数的方法
            public void callFunction(Map map);
    }
     

      3.定义映射文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <!-- 此文件主要用于编写sql语句
          namespace是为了解决相同名字的sql操作问题
       -->
    <mapper namespace="cn.et.mybatis.lesson02.func.CallMapper">
        <!-- statementType 声明指向的是什么类型,其中CALLABLE是执行存储过程和函数的-->
        <select id="queryEmp" parameterType="map" statementType="CALLABLE">
        {
            call pag_add(
                #{p1,mode=IN,jdbcType=NUMERIC},
                #{p2,mode=IN,jdbcType=NUMERIC},
                #{p3,mode=OUT,jdbcType=NUMERIC}
            )
        }
        </select>
        <!-- 定义存储过程 -->
        <select id="callProcedure" parameterType="map" statementType="CALLABLE" >
          {
             call prg_add(
                   #{p1,mode=IN,jdbcType=NUMERIC},
                   #{p2,mode=IN,jdbcType=NUMERIC},
                   #{p3,mode=OUT,jdbcType=NUMERIC}
             )
          }
      </select>
      <!-- 定义函数 -->
      <select id="callFunction" parameterType="map" statementType="CALLABLE">
              {
                  #{p3,mode=OUT,jdbcType=NUMERIC}=call fun_add(
                      #{p1,mode=IN,jdbcType=NUMERIC},
                   #{p2,mode=IN,jdbcType=NUMERIC}
                  )
              }
      </select>
    </mapper>

     4.定义主mybaits.xml文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!-- 说明mybatis的根节点 -->
    <!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <!--mybatis的根标签configuration -->
    <configuration>
        <!-- 资源文件的路径配置  注:cn前面不能用/否则会抛出异常-->
        <properties resource="cn/et/mybatis/lesson02/jdbc.properties">
        </properties>
        <!-- 配置连接数据库的环境,(开发环境) -->
      <environments default="development">
        <environment id="development">
        <!-- 事务交给jdbc管理,Conection(事务) commit(提交) rollback(回滚)  -->
          <transactionManager type="JDBC"/>
          <!-- 数据源 用来连接数据库(包含四要素,driver,url,username,password) -->
          <dataSource type="POOLED">
            <property name="driver" value="${driverClass}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${userAccount}"/>
            <property name="password" value="${password}"/>
          </dataSource>
        </environment>
      </environments>
      <!-- 包含隐射文件主要用于编写sql语句 -->
      <mappers>
          <!-- 隐射的资源文件  隐射文件主要编写sql语句 -->
        <mapper resource="cn/et/mybatis/lesson02/func/call_mapper.xml"/>
      </mappers>
    </configuration>

     5.定义测试类

    package cn.et.mybatis.lesson02.func;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;
    
    public class TestMyBatis {
        //封装session的返回
        public static SqlSession getSession(){
            String resource = "/cn/et/mybatis/lesson02/mybatis.xml";
            InputStream inputStream =TestMyBatis.class.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //操作数据库的类 SqlSession
            SqlSession session=sqlSessionFactory.openSession();
            return session;
        }
        //调用存储过程
        public static void main(String[] args) throws IOException {
            SqlSession session=getSession();
            CallMapper cm=session.getMapper(CallMapper.class);
            Map map=new HashMap();
            map.put("p1", 100);
            map.put("p2", 200);
            cm.callProcedure(map);
            System.out.println(map.get("p3"));
        }
        
        @Test
        //调用函数
        public void funTest(){
            SqlSession session=getSession();
            CallMapper cm=session.getMapper(CallMapper.class);
            Map map=new HashMap();
            map.put("p1", 100);
            map.put("p2", 400);
            cm.callFunction(map);
            System.out.println(map.get("p3"));
        }
    }

      以上为存储过程和函数的调用

    //查询函数的方法public void callFunction(Map map);

  • 相关阅读:
    java相关知识集锦
    adb相关基础知识集锦
    我所理解的OOP——UML六种关系
    据说每个大牛、小牛都应该有自己的库——DOM处理续
    据说每个大牛、小牛都应该有自己的库——DOM处理
    JavaScript 继承
    据说每个大牛、小牛都应该有自己的库——Event处理
    据说每个大牛、小牛都应该有自己的库——框架篇
    可拖动的DIV续
    CSS hack前传——背景图片全屏
  • 原文地址:https://www.cnblogs.com/xushirong/p/6999568.html
Copyright © 2011-2022 走看看