转:http://zachary-guo.iteye.com/blog/1756689

Mybats 是 iBatis 被 Google 收购后重新命名的一个工程,当然也做了大量的升级。iBatis 2.x 调用存储过程有一个专门的标签 <procedure>,在 Mybats 3.x 里面已经没有这个标签了,而是通过一个参数 statementType="CALLABLE" 来区分。

存储过程有三种类型的参数,分别为 IN(输入参数),OUT(输出参数),INOUT(输入输出参数)。一个存储过程,可以有多个 IN 参数,至多有一个 OUT 或 INOUT 参数。

◇ 只有 IN 参数的存储过程

  1. CREATE PROCEDURE proc_only_input (
  2. @hello VARCHAR(8) IN
  3. ) AS
  4. ...
  1. <select id="selectSth" statementType="CALLABLE" parameterType="hashmap">
  2. <![CDATA[
  3. { call proc_only_input(#{good, mode=IN, jdbcType=VARCHAR}) }
  4. ]]>
  5. </select>
  1. Map params = new HashMap();
  2. // 调用存储过程的传递的参数名可以不和定义存储过程的参数名保持一致,只要保证它们的顺序是一致的即可。
  3. params.put("good", "china");
  4. session.select("pkg.selectSth", params);

◇ 有 INOUT 或 OUT 参数的存储过程

  1. CREATE PROCEDURE proc_out (
  2. @yes VARCHAR(8) IN,
  3. @fly VARCHAR(16) OUT
  4. ) AS
  5. ...
  6. return 'return something'
  1. <!--
  2. 如果调用的过程中存在 out 参数,那么所有的参数都必须用问号的形式传入,如: { call test_procedure(?, ?, ?, ?)}。要是有参数不是问号形式传入,如:{ call test_procedure(?, 3, ?, ?)},则会异常伺候:Output parameter not allowed as argument list prevents use of RPC
  3. 另外,对于有输出参数的存储过程,理论上也可以这样写:
  4. { #{gog, mode=OUT, jdbcType=VARCHAR} = call proc_out(#{yes, mode=IN, jdbcType=VARCHAR}) }
  5. 可我在 sql server 中尝试这样写,报错,说是却是 @fly 参数(proc_out 的第二个参数的名字就是 fly)。既然如此,那我就一个一个参数的写,就像下面的这样。
  6. -->
  7. <select id="selectSth" statementType="CALLABLE" parameterType="hashmap">
  8. <![CDATA[
  9. { call proc_out(#{yes, mode=IN, jdbcType=VARCHAR}, #{gog, mode=OUT, jdbcType=VARCHAR}) }
  10. ]]>
  11. </select>
    1. Map params = new HashMap();
    2. // 调用存储过程的传递的参数名可以不和定义存储过程的参数名保持一致,只要保证它们的顺序是一致的即可。
    3. // 同时,存储过程的输出参数的值必须通过 map 来接收
    4. params.put("yes", "china");
    5. session.select("pkg.selectSth", params);
    6. // 得到输出参数的值
    7. String result = params.(String) get("gog");

MyBatis 3 中使用存储过程的更多相关文章

  1. MyBatis中调用存储过程和函数

    一.调用存储过程 1.首先在数据库中定义存储过程,定义的存储过程的代码如下: //定义存储过程 create or replace procedure pag_add(p1 varchar2,p2 v ...

  2. mybatis调用mysql的存储过程(procedure),实现查询操作(student表中的某个年级中的总人数 select (1) 或者 select (*))

    step1:在mysql cmd中新建存储过程: drop procedure if exists queryCountByGrade ; delimiter // -- 定义存储过程结束符号为// ...

  3. Mybatis调用Oracle中的存储过程和function

    一.Mybatis调用存储过程 1 在数据库中创建以下的存储过程create or replace procedure pro_hello(p_user_name in varchar2,p_resu ...

  4. Mybatis调用数据库的存储过程和方法

     转载. https://blog.csdn.net/ml0228123/article/details/81002258   上次的项目,要求我用java代码调用存储过程,折腾了好久.最后总算成功了 ...

  5. Entity Framework 6 Recipes 2nd Edition(10-6)译 -> TPT继承模型中使用存储过程

    10-6. TPT继承模型中使用存储过程 问题 想在一个TPT继承模型中使用存储过程 解决方案 假设已有如Figure 10-6所示模型. 在模型里, Magazine(杂志) and DVD继承于基 ...

  6. Entity Framework 6 Recipes 2nd Edition(10-7)译 -> TPH继承模型中使用存储过程

    10-7. TPH继承模型中使用存储过程 问题 用一个存储过程来填充TPH继承模型的实体 解决方案 假设已有如Figure 10-7所示模型. 我们有两个派生实体: Instructor(教员)和St ...

  7. C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息

      C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度.不然获取到的结果总是只有第一字符.本人就是由于这个原因,折腾了很久.在此记录一下,供大家以后参考! 例如: ...

  8. Mybatis框架中实现双向一对多关系映射

    学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...

  9. Oracle中执行存储过程call和exec区别

    Oracle中执行存储过程call和exec区别 在sqlplus中这两种方法都可以使用: exec pro_name(参数1..); call pro_name(参数1..); 区别: 1. 但是e ...

随机推荐

  1. NSArray或NSDictionary中汉字输出

    1.问题: NSArray *array = [NSArray arrayWithObjects:@"我",@"在",@"鼓楼", nil] ...

  2. Tinyxml封装类COperatorXml

    OperatorXml.h头文件 #ifndef _OPERATOR_XML_H_ #define _OPERATOR_XML_H_ #include <string> class TiX ...

  3. linux系统定时重启tomcat

    #touch auto-start.sh [root@Linux opt]# echo $LANGen_US.UTF-8 #vim auto-start.sh #!/bin/sh export LAN ...

  4. PoolManager 简单使用

    如图,创建空物体并命名 PoolManager,添加 脚本 spawn pool,并添加 如上图右边一些 参数,prefab为 Resources中 的预置体. 添加 空物体并 改名,如上图,并添加脚 ...

  5. CodeForces--TechnoCup--2016.10.15--ProblemA--Transformation: from A to B

    http://codeforces.com/contest/727/problem/A Transformation: from A to B time limit per test 1 second ...

  6. hadoop中联结不同来源数据

    装载自http://www.cnblogs.com/dandingyy/archive/2013/03/01/2938462.html 有时可能需要对来自不同源的数据进行综合分析: 如下例子: 有Cu ...

  7. protobuf与json互相转换

    Java http://code.google.com/p/protobuf-java-format/ maven <dependency> <groupId>com.goog ...

  8. Entity Framework 学习初级篇7--基本操作:增加、更新、删除、事务

    本节,直接写通过代码来学习.这些基本操作都比较简单,与这些基本操作相关的内容在之前的1至6节基本介绍完毕. l           增加: 方法1:使用AddToXXX(xxx)方法:实例代码如下: ...

  9. java打jar包

    一.打包jar文件 1      如果是class文件     jar cvf myjar.jar Foo.class Bar.class 如果是包     jar cvf myjar.jar pac ...

  10. MDK下调试时提示AXF文件无法导入的解决方法(转)

    源:http://blog.163.com/zhaojun_xf/blog/static/3005058020117784643555/ 在开发ARM项目中,很多工程师都不太喜欢使用MDK的调试模式, ...