开发的时候遇到如下问题:将一个存储过程的所有结果集收集起来,或者多段查询复用一个临时表,那么如何用mybatis的方式收集呢?
我们可以用如下代码解决:(注:下面是用的sqlserver的写法)
<select id="findAll" resultMap="aa,bb" >
SELECT
line,
COUNT(DISTINCT BoardSN+imulti) alls
INTO #2
FROM
board_new_Summary
WHERE
fdate >'2019-07-02 08:00:00'
GROUP BY
line
select * from #2;
select * from #2 ORDER BY alls;
</select>
<resultMap id="aa" type="com.sqlunit.entity.Board">
<result column="line" property="line"></result>
<result column="alls" property="alls"></result>
</resultMap>
<resultMap id="bb" type="com.sqlunit.entity.Board">
<result column="line" property="line"></result>
<result column="alls" property="alls"></result>
</resultMap>
可以看出mybatis的resultMap其实也可以放一个数组或者list结果集,那么mapper层如何取接收呢?
当然是用泛型接收,最外层的list表示两个resultMap(即查出来的两张表),里面的一层list才是表示每张表的所有记录。
List<List<?>> findAll();
那么service层如何取出里面的所有记录做操作呢?参考如下代码:
List<List<?>> all = aoiBoardMapper.findAll();
//获取第一个结果集,强转类型
List<Board> list = (List<Board>) all.get(0);
for (Board board : list) {
//逻辑操作
}
System.out.println("---------------");
//获取第二个结果集
List<Board> list = (List<Board>) all.get(1);
for (Board board : list) {
//逻辑操作
}
有人会有疑问,如果查出来的结果集很多,还必须封装成不同的实体类,那不得写代码写到累死嘛!所以你们的resultMap甚至可以直接用map类型去接收,像这样:
<resultMap id="aa" type="java.util.Map">
</resultMap>
<resultMap id="bb" type="java.util.Map">
</resultMap>
是不是方便省事,也不用那么麻烦的写那么多对应关系了。在service层中直接就将实体类改为map类型就可以了。