0
点赞
收藏
分享

微信扫一扫

记录利用泛型实现第三方接口数据快速对接

沐之轻语 03-13 19:00 阅读 1

步骤:

1,解析第三方的文档。生成建表语句。

2,利用第三方工具快速生成模板代码(实体,service....)

3,编写泛型方法实现通用的数据入库。


    /**
     * @author zhaoYongCheng
     * @param baseUrl 接口地址前缀
     * @param service 继承了 IService 的 service接口。
     * @param entityClass 表实体对应的Class类
     * @param interfaceName 接口名
     * @param apiName 数据归集名称(用于日志记录)
     * @description 根据接口地址及接口名发送get请求获取对应的list数据,并调用对应service的“批量新增更新方法”
     * @creatTime 2023/6/20 16:12
     */
    @Override
    public <T> void syncData(String baseUrl, IService<T> service, Class<T> entityClass, String interfaceName, String apiName){
        log.info("开始:{}", apiName);
        int pageNum = 1;
        int pageSize = 1000;
        List<T> list = null;

        while(true){
            try{
                list = getDataListByDefaultTokenAndInterfaceName(baseUrl, entityClass, interfaceName, pageNum, pageSize);
                service.saveOrUpdateBatch(list);
            }catch (Exception e){
                log.error("==============数据保存出错啦=======");
                e.printStackTrace();
            }

            int saveDataNum = Objects.isNull(list) ? 0 : list.size();
            log.info(apiName + "-数据入库第" + pageNum + "次  完成。入库数据量:" + saveDataNum);

            if(saveDataNum < pageSize){
                return;
            }

            pageNum += 1;
        }
    }

    /**
     * @author zhaoYongCheng
     * @param baseUrl 接口地址前缀
     * @param entityClass 表实体对应的Class类
     * @param interfaceName 接口名
     * @param pageNumber 请求页码
     * @param pageSize 每页大小
     * @description 根据入参发送get请求获取数据,将对应json数据转为list<实体>
     * @creatTime 2023/6/20 16:07
     * @return java.util.List<t>
     */
    @Override
    public <t> List<t> getDataListByDefaultTokenAndInterfaceName(String baseUrl, Class<t> entityClass, String interfaceName,
                                                                 Integer pageNumber, Integer pageSize) {
        //apiService.getRequestUrlPaging 自定义的拼接接口地址的方法                                                         
        String requestUrl = apiService.getRequestUrlPaging(baseUrl, interfaceName, pageNumber, pageSize);
        log.info("请求地址:=============》》" + requestUrl);
        String requestResultStr = HttpUtil.get(requestUrl);
        return JSONObject.parseArray(requestResultStr, entityClass);
    }



针对第三方接口的实体,抽出基类。并在泛型方法使用基类字段时的代码写法

insertOrUpdateBathByDuplicateKey 是自定义的批量插入更新的方法。具体请自己百度mybatis实现真正的批量插入操作

 /**
     * @author zhaoYongCheng
     * @description xxx
     * 成功:返回数据条数,并将数据入库。
     * 失败:返回错误信息
     * @param requestMap 请求参数()
     * @param basicMapper 对应接口的Mapper
     * @param entityClass 对应接口的实体类class对象
     * @param interfaceName 接口名
     * @param interfacePathStr 接口地址
     * @param syncDate 数据同步日期 记日志用
     * @param listOrNot 返回的result是否包含数组
     * @creatTime 2023/12/21 16:08
     * @return java.lang.String
     */
public <T extends 基类> String commonSyncDataByParamMapAndClazz(Map<String, Object> requestMap, BasicMapper<T> basicMapper,
                                                  Class<T> entityClass, String interfaceName, String interfacePathStr,
                                                       Date syncDate, boolean listOrNot){
        if (StringUtils.isBlank(interfacePathStr)) {
            return "接口地址咋传空了呢";
        }
        
        long followId = System.currentTimeMillis();
        requestMap.put("flowId", followId);
        int pageNum = Convert.toInt(requestMap.get("pageNum"), 1);
        requestMap.put("pageNum", pageNum);
        requestMap.put("pageSize", MAX_PAGE_SIZE);

        //查询数据
        String postResult = null;
        String postErrorMsg = "";
        try {
            postResult = XXXUtil.post(url.concat(interfacePathStr), JSONObject.toJSONString(requestMap));
            log.info("===={}=====postResult:{}======", followId, postResult);
        } catch (Exception e) {
            
        }

        JSONObject jsonObject = JSONObject.parseObject(postResult);
        
        Integer total = Convert.toInt(jsonObject.get("total"), -1);
        if (!listOrNot) {
            //返回结果不是list
            T obj;
            obj = JSONObject.parseObject(Convert.toStr(jsonObject), entityClass);
            //设置基类的属性值
            obj.setXXX(xxx);
            obj.setXXXX(xxxx);
            basicMapper.insertOrUpdateBathByDuplicateKey(Collections.singletonList(obj));
            return "success save one";
        }

        if(total < 1) {
            return total.toString();
        }

        //保存本次list数据
        Object list = jsonObject.get("list");
        List<T> objList = JSONObject.parseArray(list.toString(), entityClass);
        objList.forEach(obj -> {
            //设置基类的属性值
            obj.setXXX(xxx);
            obj.setXXXX(xxxx);
        });
        basicMapper.insertOrUpdateBathByDuplicateKey(objList);

        //判断是否存在未获取到的数据
        int currentSaveDataNum = MAX_PAGE_SIZE * pageNum;
        if(total > currentSaveDataNum) {
            //覆盖页码参数
            requestMap.put("pageNum", pageNum + 1);
            //递归获取下页数据
            commonSyncDataByParamMapAndClazz(requestMap, basicMapper, entityClass, interfaceName, interfacePathStr, syncDate, true);
        }
        return total.toString();
    }

记录利用泛型实现第三方接口数据快速对接_List


end。

举报

相关推荐

0 条评论