MyBatis还能对存储过程进行完全支持,这节开始学习存储过程。在讲解之前,我们需要对存储过程有一个基本的认识,首先存储过程是数据库的一个概念,它是数据库预先编译好,放在数据库内存中的一个程序片段,所以具备性能高,可重复使用的特性。它定义了3种类型的参数:输入参数、输出参数、输入输出参数。
•输入参数,是外界给的存储过程参数,在Java互联网中,也就是互联网系统给它的参数。
•输出参数,是存储过程经过计算返回给程序的结果参数。
•输入输出参数,是一开始作为参数传递给存储过程,而存储过程修改后将其返回的参数,比如那些商品的库存就是这样的。
对于返回结果而言,一些常用的简易类型,比如整形、字符型OUT或者INOUT参数是Java程序比较好处理的,而存储过程还可能返回游标类型的参数,这需要我们处理,不过在MyBatis中,这些都可以轻松完成。
IN和OUT参数存储过程
先讨论IN和OUT参数的基本用法,这里使用的是Oracle数据库,它对存储过程有着较好的支持,下面先定义一个场景。
根据角色名称进行模糊查询其总数,然后把总数和查询日期返回给调用者。为此先建一个简单的存储过程,在Oracle的命令行输入存储过程,如代码清单的代码。
CREATE OR REPLACE PROCEDURE count_role ( p_role_name IN VARCHAR, count_total out INT, exec_date out DATE ) IS BEGIN SELECT COUNT (*) INTO count_total FROM "t_role" WHERE "role_name" LIKE ‘%‘ || p_role_name || ‘%‘ ; SELECT SYSDATE INTO exec_date FROM dual; END ;
public class PdCountRoleParams { private String roleName; private int total; private Date execDate; }
<select id="countRole" parameterType="com.xc.pojo.procedures.PdCountRoleParams" statementType="CALLABLE"> {call count_role(#{roleName, mode=IN, jdbcType=VARCHAR}, #{total, mode=OUT, jdbcType=INTEGER}, #{execDate, mode=OUT, jdbcType=DATE})} </select>
•指定statemetType为CALLABLE,说明它是在使用存储过程,如果不这样声明那么这段代码将会抛出异常。
•定义了parameterType为PdCountRoleParams参数。
•在调度存储过程中放入参数对应的属性,并且在属性上通过mode设置了其输入或者输出参数,指定对应的jdbcType,这样MyBatis就会使用对应的typeHandler去处理对应的类型转换。
PdCountRoleParams params = new PdCountRoleParams();SqlSession sqlSession = null;try { sqlSession = SqlSessionFactoryUtils.openSqlSession(); RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class); params.setRoleName("法师"); roleMapper.countRole(params); System.out.println(params.getRoleName()); System.out.println(params.getTotal()); System.out.println(params.getExecDate()); } catch (Exception e) { e.printStackTrace();} finally { if (sqlSession != null) { sqlSession.close(); }}
原文地址:https://www.cnblogs.com/ooo0/p/10951871.html