对于存储过程语法这里不再详细解说,请自行百度。
**
1.创建存储过程mydemo08(返回int类型数据),其中输入参数为ids,输出参数为bmode。
**
create or replace procedure mydemo08(ids in varchar,bmode out int)
as
begin
select Y_MODE into bmode from REC_BALANCE where BALANCE_ID = ids; --查
commit;
end;
可以在PL/SQL工具测试以上存储过程语句是否正确执行,复制以下代码在PL/SQL工具执行查看效果。
--执行存储过程
declare
ids varchar(10);
bmode int;
begin
ids:='4';
mydemo08(ids=>ids,bmode=>bmode);
dbms_output.put_line('bomde='||bmode);
end;
输出结果为
bomde=10
创建好存储过程后来配置mybatis的映射文件,配置如下
<!-- 调用存储过程 (返回一个整型数据)-->
<select id="mydemo08" parameterType="pd" resultType="Integer" statementType="CALLABLE">
{call mydemo08(#{ids,mode=IN,jdbcType=VARCHAR},#{bmode,mode=OUT,jdbcType=INTEGER})}
</select>
配置好映射文件就可以在service层通过SqlSessionTemplate来调用存储过程了,service代码如下
/**调用存储过程(返回单值)
* @param pd
* @throws Exception
*/
public void select(PageData pd)throws Exception{
SqlSession session=dao.getsqlsession();
try {
dao.findForObject("BalanceMapper.mydemo08", pd);
System.out.println(pd.get("bmode")); //获取返回值
} catch (Exception e) {
e.printStackTrace();
}
}
dao层代码如下
public Object findForObject(String str, Object obj) throws Exception {
return sqlSessionTemplate.selectOne(str, obj);
}
最后controller调用service层方法即可。
**
2.创建存储过程mydemo09 (返回实体类对象列表集合类型)
**
create or replace procedure mydemo09(u in varchar,
t out SYS_REFCURSOR
)
is
begin
open t for select * from REC_BALANCE where LOGIN_USER=u;
end;
在PL/SQL工具测试以上存储过程语句是否正确执行,复制以下代码在PL/SQL工具执行查看效果。
--执行存储过程
declare
t sys_refcursor;
s REC_BALANCE%rowtype; --变量s与REC_BALANCE表中的各个列类型相同
begin
mydemo09('a01',t);
loop
fetch
t into s;
dbms_output.put_line(s.LOGIN_USER||' '||s.YE_NUM||' '||s.Y_TIME||' '||s.Y_MODE||' '||s.BALANCE_ID);
exit when t%notfound; --游标一条一条地遍历记录,当找不到记录时退出
end loop;
close t;
end;
输出结果为查询到的记录条数
a01 60 2019-12-20 15:23:43 3 9f521cfae76a44b0b7bd3af80c047ce7
a01 60 2019-12-20 15:23:43 3 9f521cfae76a44b0b7bd3af80c047ce7
创建好存储过程后来配置mybatis的映射文件,配置如下
<!-- 调用存储过程 (返回实体类对象列表集合类型)-->
<select id="mydemo09" statementType="CALLABLE" parameterType="pd">
{call mydemo09(#{u,mode=IN,jdbcType=VARCHAR},#{s,mode=OUT,jdbcType=CURSOR,javaType=ResultSet,resultMap=BalanceResultMap})}
</select>
<resultMap type="Balance" id="BalanceResultMap">
<id column="BALANCE_ID" property="BALANCE_ID"/>
<result column="LOGIN_USER" property="LOGIN_USER"/>
<result column="YE_NUM" property="YE_NUM"/>
<result column="Y_TIME" property="Y_TIME"/>
<result column="Y_MODE" property="Y_MODE"/>
</resultMap>
配置好映射文件就可以在service层通过SqlSessionTemplate来调用存储过程了,service代码如下
/** 调用存储过程 (返回实体类对象列表集合类型)
* @param pd
* @throws Exception
*/
public void selectall(PageData pd)throws Exception{
try {
dao.findForList("BalanceMapper.mydemo09", pd);
ArrayList<Balance> cursorList = (ArrayList<Balance>)pd.get("s");
if(cursorList!=null&&cursorList.size()!=0){
System.out.println("用户名"+"\t"+"余额数量"+"\t"+"获取时间"+"\t"+"获取方式"+"\t"+"ID");
for (Balance cursor : cursorList) {
System.out.println(cursor.getLOGIN_USER()+"\t"+cursor.getYE_NUM()+"\t"+cursor.getY_TIME()+"\t"+cursor.getY_MODE()+"\t"+cursor.getBALANCE_ID());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
dao层代码如下
public Object findForList(String str, Object obj) throws Exception {
return sqlSessionTemplate.selectList(str, obj);
}
最后controller调用service层方法即可。控制台输出的结果如下: