• 实际开发中,我们通常也会写一些存储过程,MyBatis也支持对存储过程的调用
• 一个最简单的存储过程delimiter $$create procedure test()beginselect 'hello';end $$delimiter ;
• 存储过程的调用
1、select标签中statementType=“CALLABLE”
2、标签体中调用语法:{call procedure_name(#{param1_info},#{param2_info})}
二、使用
1、编写一个存储过程:
create or replace procedure
hello_test(
p_start in int,p_end in int,p_count out int,p_emps out sys_refcursor
) AS
BEGIN
select count(1) into p_count from TB_EMPLOYEE;
open p_emps FOR
select * from (select rownum rn ,c.* from TB_EMPLOYEE c where rownum <=p_end) where rn >=p_start;
end hello_test;
可以查询所有的存储过程
select * from user_source;
2 调用
• MyBatis对存储过程的游标提供了一个JdbcType=CURSOR的支持可以智能的把游标读取到的数据,映射到我们声明的结果集中
<!--public void getPageByProcedure(OraclePage page);
-->
<!-- public void getPageByProcedure();
1、使用select标签定义调用存储过程
2、statementType="CALLABLE":表示要调用存储过程
3、{call procedure_name(params)} :固定写法
jdbcType:需要参考枚举类JdbcType
-->
<select id="getPageByProcedure" statementType="CALLABLE" databaseId="oracle" useCache="false">
{call hello_test(
#{start,mode=IN,jdbcType=INTEGER},
#{end,mode=IN,jdbcType=INTEGER},
#{count,mode=OUT,jdbcType=INTEGER},
#{emps,mode=OUT,jdbcType=CURSOR,javaType=ResultSet,resultMap=oraclePage}
)}
</select>
<resultMap id="oraclePage" type="com.mybatis.entity.Employee">
<id column="id" property="id"/>
<result column="email" property="email"/>
<result column="gender" property="gender" />
<result column="last_name" property="lastName" />
</resultMap>
@Test
public void testProcedure() {
SqlSession sqlSession = null;
try {
sqlSession = EmployeeTest.getSqlSession();
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
OraclePage page = new OraclePage();
page.setStart(1);
page.setEnd(4);
mapper.getPageByProcedure(page);
System.out.println("总记录数:"+page.getCount());
System.out.println("查询的数据员工有几个:"+page.getEmps().size());
System.out.println("员工数据:"+page.getEmps());
} catch (IOException e) {
e.printStackTrace();
}finally{
sqlSession.close();
}
}