通过本文简单描述下mybatis如何调用存储过程,以及获取相应的结果集。
1、数据库表结构
create table TSYS_USER
(
id NUMBER(38) not null,
user_name VARCHAR2(100),
login_name VARCHAR2(100),
user_password VARCHAR2(100),
user_phone VARCHAR2(100),
user_type VARCHAR2(4),
create_date DATE,
user_group INTEGER
)
数据自己插入吧,这里不再赘述。
2、利用mybatis代码工具自动生成实体类和mapper文件,实体类User就不贴代码了.
User中添加toString()方法,为方便后面的信息打印。
3、 返回简单类型的存储过程
(1)创建简单存储过程,根据id获取数据库中tsys_user表的user_name,语句如下:
CREATE OR REPLACE Procedure getUserNameById(tid integer,name out varchar2)
As
begin
select user_name into name from tsys_user where id=tid;
End;
(2)创建的测试Mapper-TestMapper.xml如下配置:
<mapper namespace="com.cicc.am.test.TestMapper" >
<select id="SelectProNameById" statementType="CALLABLE" parameterType="java.util.Map" >
{call getUserNameById(#{tid,mode=IN,jdbcType=INTEGER},#{name,mode=OUT,jdbcType=VARCHAR})}
select>
mapper>
(3)调用存储过程语句
Map<String, Object> props2 = new HashMap<String, Object>();
String name=null;
props2.put("tid", 211);//入参 tid
props2.put("name", name);//出参 user_name
baseService.executeProcedureByMap(props2, "com.cicc.am.test.TestMapper.SelectProNameById");
System.out.println(props2.get("name"));
4、返回游标结果集的存储过程
(1)创建返回游标结果集的存储过程,获取数据库中tsys_user表的所有用户信息,语句如下:
CREATE OR REPLACE Procedure getUserList(cur_arg out Sys_Refcursor)
As
begin
open cur_arg for Select * From tsys_user;
End;
(2)TestMapper.xml增加配置如下:
<select id="SelectProList" statementType="CALLABLE" parameterType="java.util.Map" >
{call getUserList(#{cur, mode=OUT, jdbcType=CURSOR,javaType=java.sql.ResultSet,resultMap=com.cicc.am.source.security.user.UserMapper.BaseResultMap})}
select>
(3)调用存储过程语句
Map<String, Object> props = new HashMap<String, Object>();
List<User> temp=new ArrayList<User>();
props.put("cur", temp);//出参cursor结果集
baseService.executeProcedureByMap(props, "com.cicc.am.test.TestMapper.SelectProList");
List<User> user_list=(List<User>)props.get("cur");
System.out.println(user_list);