Mybatis 调用存储过程

接口

public interface TestMapper {

    void execuStoredprocedure(Map<String, String> paramMap);
}
  • 通过statementType="CALLABLE"指定存储过程调用
  • 通过mode=IN指定输入参数
  • 通过mode=OUT指定输出参数
<?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">
<mapper namespace="XXX.TestMapper">
    <select id="execuStoredprocedure" parameterType="java.util.Map" statementType="CALLABLE">
        {CALL
            存储过程名称(
            #{param1,mode=IN,jdbcType=VARCHAR},
            #{param2,mode=IN,jdbcType=VARCHAR},
            #{param3,mode=OUT,jdbcType=INTEGER})
        }
    </select>
</mapper>

如果调用存储过程,既有出参,又有返回值的话

<?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">
<mapper namespace="XXX.TestMapper">
    <select id="execuStoredprocedure" parameterType="java.util.Map" statementType="CALLABLE">
        {
        	<!-- ⏹在CALL之前添加如下代码即可⏹ -->
        	#{param4, mode=OUT, jdbcType=VARCHAR} = CALL 存储过程名称(
            #{param1, mode=IN, jdbcType=VARCHAR},
            #{param2, mode=IN, jdbcType=VARCHAR},
            #{param3, mode=OUT, jdbcType=INTEGER})
        }
    </select>
</mapper>

调用

Map<String, Object> paramMap = new HashMap<String, Object>();
// 输入参数,向存储过程中传值
map.put("param1", "测试参数1");
map.put("param2", "测试参数2");
// 输出参数,存储过程的返回值会保存到该key对应的value中
map.put("param3", null);
// 用来接收存储过程的返回值(若存在返回值的话)
map.put("param4", null);

/*
	虽然我们接口无返回值,但是因为调用的是存储过程,并且指定了param3为输出参数
	因此存储过程执行的结果会反映到Map中,调用完存储过程之后,可以在map中获取到返回值
*/ 
mapper.execuStoredprocedure(paramMap);

// 调用完存储过程之后,获取返回值
System.out.println(paramMap.get("param3"));

参考资料

  1. https://blog.csdn.net/chujianbi7142/article/details/100894651
  2. https://www.cnblogs.com/Marydon20170307/p/14134373.html
  3. https://blog.csdn.net/dwenxue/article/details/82257944
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、付费专栏及课程。

余额充值