Mybatis调用存储过程

本文介绍了如何在 Mybatis 3.x 中调用存储过程,由于不再使用 <procedure> 标签,而是通过设置 statementType="CALLABLE" 来实现。详细解析了只有 IN 参数和包含 INOUT 或 OUT 参数的存储过程的调用方式,并给出了相应的 XML 和 Java 示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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");
MyBatis可以通过调用存储过程来执行数据库操作。下面是一个简单的示例: 1. 创建存储过程 在数据库中创建一个存储过程,例如: ```sql CREATE PROCEDURE get_user_by_id(IN id INT, OUT name VARCHAR(20)) BEGIN SELECT user_name INTO name FROM user WHERE user_id = id; END ``` 该存储过程接受一个输入参数id,一个输出参数name,根据id查询用户信息并将用户名赋值给name。 2. 编写Mapper文件 在MyBatis的Mapper文件中,定义一个<select>标签,调用存储过程,例如: ```xml <select id="getUserById" statementType="CALLABLE"> CALL get_user_by_id(#{id, mode=IN, jdbcType=INTEGER}, #{name, mode=OUT, jdbcType=VARCHAR}) </select> ``` 该<select>标签的id属性为getUserById,statementType属性为CALLABLE,表示调用存储过程。 3. 调用存储过程 通过SqlSession的selectOne方法调用存储过程,例如: ```java SqlSession sqlSession = sqlSessionFactory.openSession(); try { Map<String, Object> paramMap = new HashMap<String, Object>(); paramMap.put("id", 1); sqlSession.selectOne("getUserById", paramMap); String name = (String)paramMap.get("name"); // 处理返回值 } finally { sqlSession.close(); } ``` 该代码创建一个SqlSession对象,调用selectOne方法执行getUserById查询,将查询结果存储在paramMap中,最后从paramMap中获取name的值。 以上就是一个简单的MyBatis调用存储过程的示例,具体的实现方式还需要按照实际情况进行适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值