2022年8月15日 作者 zeroheart

MyBatis 流式读取大量MySQL数据

原文:https://mp.weixin.qq.com/s/3wZDhmM21wBAXWKmNZZUKA

JDBC三种读取方式:

1、 一次全部(默认):一次获取全部;
2、 流式:多次获取,一次一行;
3、 游标:多次获取,一次多行;

mybatis默认采取第一种。

实现步骤:

这里采用的 controller、service、dao分层开发

  • 在service层调用dao接口是,增加一个回调参数 ResultHandler<>
  • 对应的dao接口返回值为void
  • mapper 填写 parameterType、resultMap、 resultSetType=“FORWARD_ONLY”、 fetchSize=”-2147483648″

为什么dao返回值为void还要在mapper写resultMap?因为回调要用你的resultMap处理,但是不应该返回给service,因为回调处理好了

service层(重点)

public List<Bo> selectForwardOnly(Vo vo, Order order) {
     final List<Bo> list = new ArrayList<>();
    mapper.selectForwardOnly(vo, order, new ResultHandler<Bo>() {
      @Override
      public void handleResult(ResultContext<? extends Bo> resultContext) {
        /**回调处理逻辑 */
        list.add(resultContext.getResultObject());
      }
  });
    return list;
  }

dao层:(重点)

  /**
   * 流式读取数据
   * @param vo 查询对象
   * @param order 排序
   * @param ossVipCustomerBoResultHandler 回调处理
   */
  void selectForwardOnly(@Param("record") Vo vo, @Param("order") Order order,
      ResultHandler<Bo> handler);

mapper:(重点)

回头有需求可以尝试下,主要是处理降低服务压力,减少gc