转: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 参数的存储过程
- CREATE PROCEDURE proc_only_input (
- @hello VARCHAR(8) IN
- ) AS
- ...
- <select id="selectSth" statementType="CALLABLE" parameterType="hashmap">
- <![CDATA[
- { call proc_only_input(#{good, mode=IN, jdbcType=VARCHAR}) }
- ]]>
- </select>
- Map params = new HashMap();
- params.put("good", "china");
- session.select("pkg.selectSth", params);
◇ 有 INOUT 或 OUT 参数的存储过程
- CREATE PROCEDURE proc_out (
- @yes VARCHAR(8) IN,
- @fly VARCHAR(16) OUT
- ) AS
- ...
- return ‘return something‘
- <!--
- 如果调用的过程中存在 out 参数,那么所有的参数都必须用问号的形式传入,如: { call test_procedure(?, ?, ?, ?)}。要是有参数不是问号形式传入,如:{ call test_procedure(?, 3, ?, ?)},则会异常伺候:Output parameter not allowed as argument list prevents use of RPC
-
- 另外,对于有输出参数的存储过程,理论上也可以这样写:
- { #{gog, mode=OUT, jdbcType=VARCHAR} = call proc_out(#{yes, mode=IN, jdbcType=VARCHAR}) }
-
- 可我在 sql server 中尝试这样写,报错,说是却是 @fly 参数(proc_out 的第二个参数的名字就是 fly)。既然如此,那我就一个一个参数的写,就像下面的这样。
- -->
- <select id="selectSth" statementType="CALLABLE" parameterType="hashmap">
- <![CDATA[
- { call proc_out(#{yes, mode=IN, jdbcType=VARCHAR}, #{gog, mode=OUT, jdbcType=VARCHAR}) }
- ]]>
- </select>
- Map params = new HashMap();
- params.put("yes", "china");
- session.select("pkg.selectSth", params);
- String result = params.(String) get("gog");
MyBatis 3 中使用存储过程
原文:http://www.cnblogs.com/antball/p/4586197.html