MyBatis懒加载数据(大批量数据处理)

使用范例

Cursor约定使用Iterator去懒加载数据,以时间换空间,非常适合处理通常无法容纳在内存中的数百万个项目查询。如果在 resultMap 中使用集合,则必须使用 resultMap 的 id 列对游标 SQL 查询进行排序(resultOrdered="true")。

java 复制代码
//为了避免bug,手动管理一个session
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
    DDeviceShopIndexStatusMapper shopIndexStatusMapper = sqlSession.getMapper(DDeviceShopIndexStatusMapper.class);
    try (Cursor<DAlarmEventDTO> cursor = shopIndexStatusMapper.selectDevicesForShopClosed(commonProperties.getOpenShopStatus(), ABNORMAL.getCode())) {
        for (DAlarmEventDTO alarmEventDTO : cursor) {
            applicationContext.publishEvent(new DeviceShopClosedEvent(new Object(), alarmEventDTO));
        }
    } catch (IOException e) {
        log.error("shopStatusCheckJob cursor error:", e);
    }
}
============================
//方法定义
Cursor<DAlarmEventDTO> selectDevicesForShopClosed(@Param("shopStatus") List<String> shopStatus, @Param("status") Integer status);
============================
//xml写法与平常无异
<select id="selectDevicesForShopClosed" resultType="com.rome.device.monitor.admin.infrastructure.remote.dto.DAlarmEventDTO">
    select ddsb.device_key,
           ....
    from d_device_detail ddd
    left join d_device_shop_bind ddsb on ddd.device_key = ddsb.device_key
    ....
    where 
    ....
</select>
相关推荐
程序员小假7 分钟前
我们来说说 ThreadLocal 的原理,使用场景及内存泄漏问题
java·后端
何中应9 分钟前
LinkedHashMap使用
java·后端·缓存
tryxr17 分钟前
Java 多线程标志位的使用
java·开发语言·volatile·内存可见性·标志位
talenteddriver22 分钟前
java: Java8以后hashmap扩容后根据高位确定元素新位置
java·算法·哈希算法
云泽80825 分钟前
STL容器性能探秘:stack、queue、deque的实现与CPU缓存命中率优化
java·c++·缓存
yyy(十一月限定版)30 分钟前
c语言——栈和队列
java·开发语言·数据结构
本地运行没问题35 分钟前
基于Java注解、反射与动态代理:打造简易ORM框架
java
ss27337 分钟前
Java线程池全解:工作原理、参数调优
java·linux·python
麦麦鸡腿堡39 分钟前
Java_MySQL介绍
java·开发语言·mysql
shoubepatien39 分钟前
JavaWeb_Web基础
java·开发语言·前端·数据库·intellij-idea