步骤:
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();
}
end。