您的位置:首页 > 其它

Mybatis调用存储过程

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

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

◇ 只有 IN 参数的存储过程 

Sql代码 收藏代码

CREATE PROCEDURE proc_only_input ( 

@hello VARCHAR(8) IN 

) AS 

... 

Xml代码 收藏代码

<select id="selectSth" statementType="CALLABLE" parameterType="hashmap"> 

<![CDATA[ 

{ call proc_only_input(#{good, mode=IN, jdbcType=VARCHAR}) } 

]]> 

</select> 

Java代码 收藏代码

Map params = new HashMap(); 

// 调用存储过程的传递的参数名可以不和定义存储过程的参数名保持一致,只要保证它们的顺序是一致的即可。 

params.put("good", "china"); 

session.select("pkg.selectSth", params); 

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

Sql代码 收藏代码

CREATE PROCEDURE proc_out ( 

@yes VARCHAR(8) IN, 

@fly VARCHAR(16) OUT 

) AS 

... 

return 'return something' 

Xml代码 收藏代码

<!-- 

如果调用的过程中存在 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> 

Java代码 收藏代码

Map params = new HashMap(); 

// 调用存储过程的传递的参数名可以不和定义存储过程的参数名保持一致,只要保证它们的顺序是一致的即可。 

// 同时,存储过程的输出参数的值必须通过 map 来接收 

params.put("yes", "china"); 

session.select("pkg.selectSth", params); 

// 得到输出参数的值 

String result = params.(String) get("gog");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ibatis 存储