返回单结果集的情况:
- 引用:
https://blog.youkuaiyun.com/a9529lty/article/details/24401423
https://blog.youkuaiyun.com/papalian/article/details/42973463
https://blog.youkuaiyun.com/qiaoshuai0920/article/details/16340361
https://blog.youkuaiyun.com/magicfoxhu/article/details/39592705
存储过程示例:
create or replace procedure Fsp_Plan_CheckPrj(v_grantno varchar2, v_deptcode number, v_cursor out sys_refcursor) is
………………
---返回统计结果
open v_Cursor for
select s.plan_code,
s.plan_dept,
s.plan_amount,
s.exec_amount,
p.cname as plan_name,
d.cname as dept_name
from Snap_plan_checkprj s
left join v_plan p
on s.plan_code = p.plan_code
left join org_office d
on s.plan_dept = d.off_org_code
group by s.plan_code,
s.plan_dept,
s.plan_amount,
s.exec_amount,
p.cname,
d.cname;
end;
end Fsp_Plan_CheckPrj;
- java层代码
Map<String, Object> params = new HashMap<String, Object>();
GrantSetting gs = this. grantSettingDao.get(grantCode);
params.put( "grantNo", StringUtils. substring(gs.getGrantNo(), 0, 2));
params.put( "offOrgCode", SecurityUtils.getPersonOffOrgCode());
params.put("v_cursor", new ArrayList<Map<String, Object>>());//传入一个jdbc游标,用于接收返回参数
this. batisDao. getSearchList("call_Fsp_Plan_CheckPrj", params);
- mybatis xml配置
<resultMap type ="java.util.HashMap" id= "cursorMap"><!--配置返回游标中别名对应的resultMap -->
<result column ="plan_code" property="plan_code" />
<result column ="plan_dept" property="plan_dept" />
<result column ="plan_amount" property="plan_amount" />
<result column ="exec_amount" property="exec_amount" />
<result column ="plan_name" property="plan_name" />
<result column ="dept_name" property="dept_name" />
</resultMap >
<!--注明statementType="CALLABLE"表示调用存储过程-->
<select id ="call_Fsp_Plan_CheckPrj" parameterType= "map" statementType="CALLABLE" resultMap="cursorMap">
{call Fsp_Plan_CheckPrj(#{grantNo, jdbcType=VARCHAR, mode=IN},
#{offOrgCode, jdbcType=INTEGER, mode=IN},
#{v_cursor, mode=OUT, jdbcType=CURSOR, resultMap=cursorMap})}
<!--传入传出参数要注明mode=IN/OUT 并要注明jdbcType(在网上可以查询mybatis支持哪些jdbcType类型),返回参数要注明对应的resultMap-->
</select >
- 最后,得到一个可遍历的list结果集 ,如service层调用
Map<String,Object> map=new HashMap<String, Object>();
map.put("id", "22333");
//取得返回的结果集
List<List<?>> results = orderDao.getOrders(map);
//第一条结果集 总数量
System.out.println(((List<Integer>)results.get(0)).get(0));
//第二条订单列表
System.out.println((List<OrderForm>)results.get(1));
返回多结果集的情况:
- 引用:
https://blog.youkuaiyun.com/ge_zhiqiang/article/details/38065629
- 存储过程的定义
CREATE PROCEDURE queryTotalNum(OUT totalNum INT , IN tableName varchar(40), IN conditions varchar(300))
begin
declare stmt varchar(2000);
declare num int;
if LENGTH(conditions)>1 then
begin
set @sqlstr=concat('SELECT COUNT(*) INTO @num from ',tableName,' where ',conditions);
end;
else
begin
set @sqlstr=concat('SELECT COUNT(*) INTO @num from ',tableName);
end;
end if;
prepare stmt from @sqlstr;
execute stmt;
deallocate prepare stmt;
set totalNum = @num;
select * from hdx_order_info LIMIT 0, 10 ;
select * from hdx_proxy_distributor LIMIT 0, 10 ;
end;
- 配置mybatis文件
<!--Map作为存储过程输入输出参数 -->
<select id="getNamesAndItems" statementType="CALLABLE" parameterType="Map" resultMap="HdxOrderInfoMap,TestMap">
{call queryTotalNum(#{totalNum,jdbcType=INTEGER,mode=OUT},#{tableName,jdbcType=INTEGER,mode=IN},#{conditions,jdbcType=INTEGER,mode=IN})}
</select>
- Mapper Dao接口
public interface IHdxOrderInfoDao {
public List<List<?>> getNamesAndItems(Map<String,Object> map);
}
附带上MyBatis 通过包含的jdbcType类型
引用:
https://www.cnblogs.com/yucongblog/p/7388648.html