java+mybatis實現分表查詢

需求:查詢用戶的模型分,我們將用戶的請求放到biz_order表中,定期更新數據庫,按月分表,查詢某一用戶先查詢biz_order表,如果沒有數據,就會循環查詢歷史表,查得數據返回數據分,查不到返回處理失敗

在這裏插入圖片描述

入參:user_id,order_id,query_sources,order_id是記錄此次請求用的,不用於查詢參數

@RequestMapping(value = "/creditData")
  @ResponseBody
  public Map<String,Object> creditData(String user_id, String querySources, String order_id) {
    MDC.put("user_id",user_id);
    MDC.put("order_id",order_id);
    MDC.put("query_source",querySources);
    logger.info("[查詢歷史數據]userId={},querySource={},orderId={}",user_id,querySources,order_id);
    try {
      String type = "credit";
      Map<String, Object> result = bizOrderService.findCreditResult(user_id, querySources,type);
      logger.info("[查詢歷史數據]result={}",result);
      return result;
    }catch (Exception e){
      logger.error("[查詢歷史數據]異常",e);
      return ScdataResult.error(DecisionProcessEnum.FAIL);
    }finally {
      MDC.clear();
    }
  }

整個查詢邏輯和流程

@Override
  public Map<String,Object> findCreditResult(String userId,String querySource,String type){
    TypeEnum typeEnum = TypeEnum.getEnumByCode(type);
    BizOrderVO bizOrderVO = new BizOrderVO();
    bizOrderVO.setUserId(userId);
    bizOrderVO.setQuerySource(querySource);
    bizOrderVO.setType(typeEnum);
    int code = thirdChannelConfigService.getThirdChannels(querySource).getCode();
    bizOrderVO.setChannelId(code);

    BizOrderPO bizOrder = findBizOrderForCredit(bizOrderVO,type);
    if(bizOrder==null){
      Map<String, Object> defaultResult = timeoutOrderHandlerTask.getDefaultResult(code);
      return ScdataResult.apply(DecisionProcessEnum.NOT_FIND,defaultResult);
    }

    Query query = new Query();
    query.addCriteria(Criteria.where("orderId").is(bizOrder.getPkid()));
    HandleResultMongoPO one = mongoTemplate.findOne(query, HandleResultMongoPO.class);
    String resultData = one.getResultData();
    JSONObject object = JSONObject.parseObject(resultData);
    if(object==null){
      Map<String, Object> defaultResult = timeoutOrderHandlerTask.getDefaultResult(code);
      return ScdataResult.apply(DecisionProcessEnum.NOT_FIND,defaultResult);
    }else{
      return ScdataResult.success(object);
    }
  }

findBizOrderForCredit方法

private BizOrderPO findBizOrderForCredit(BizOrderVO bizOrderVO,String type){
    BizOrderPO bizOrderPO = loopFindBizOrderForCredit(bizOrderVO,type);
    if(bizOrderPO==null && sameQuerySource.containsKey(bizOrderVO.getQuerySource())){
      String querySource2 = sameQuerySource.get(bizOrderVO.getQuerySource());
      int code2 = thirdChannelConfigService.getThirdChannels(querySource2).getCode();
      bizOrderVO.setChannelId(code2);
      bizOrderPO = loopFindBizOrderForCredit(bizOrderVO,type);
    }
    return bizOrderPO;
  }

loopFindBizOrderForCredit方法

private BizOrderPO loopFindBizOrderForCredit(BizOrderVO bizOrderVO,String type){
    BizOrderPO bizOrder = bizOrderDao.findOneBizOrderByUserForCredit(bizOrderVO);
    if(bizOrder==null){
      bizOrder = this.findHistoryBizOrderByUserForCredit(type,bizOrderVO.getUserId(),bizOrderVO.getChannelId());
      if(bizOrder==null){
        return null;
      }
    }
    return bizOrder;
  }

findHistoryBizOrderByUserForCredit方法

private BizOrderPO findHistoryBizOrderByUserForCredit(String type,String userId,int channelId){
    BizOrderPO bizOrderPO = null;
    String earliestMonth = "20170830";
    LocalDate earliestMt = LocalDate.parse(earliestMonth, DateTimeFormatter.ofPattern("yyyyMMdd"));
    LocalDate previousMonth = LocalDate.now().minusMonths(1);
    while (bizOrderPO==null && previousMonth.isAfter(earliestMt) ){
      String yyyyMM = DateTimeFormatter.ofPattern("yyyyMM").format(previousMonth);
      bizOrderPO = bizOrderDao.findHistoryBizOrderByUserForCredit("biz_order_history_"+yyyyMM,userId,channelId,type);
      previousMonth = previousMonth.minusMonths(1);
    }
    return bizOrderPO;
  }

mapper查詢方式

@Select("select * from `${tableName}` where user_id = #{userId} AND `status` = 2 AND  channel_id = #{channelId} AND `type` = #{type} ORDER BY create_time DESC limit 1")
  @ResultMap("BizOrder")
  BizOrderPO findHistoryBizOrderByUserForCredit(@Param("tableName") String table,@Param("userId") String userId,@Param("channelId") int channelId,@Param("type")String type);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章