springboot+mybatis 调用第三方数据基本流程

1.对接第三方接口流程:
1):一般对接第三方接口或者被第三方调用,都会有一个授权key 或者登录token之类的东西 保证数据在传输过程中的安全性,和拥有一些什么权限的设定。
2):controller类:

 @PostMapping("/getShipId")
    public Result getShipId(@RequestBody GetShipIdShipRequestVo vo) {
        log.info("query controller" + JSON.toJSONString(vo));
        Map<String, Object> result = null;
        Object value = null;
        try {
        //把参数赋值到Map中去,用于参数的传递,传递到serice中
            Map<String, Object> map = MapUtils.beanToMap(vo, Constant.LIST_FIELD);
            result = shipXyDataInfoService.queryShipId(map);
            //取map中key为data的值
            for (String key : result.keySet()) {
                value = result.get("data");
            }
        } catch (Exception e) {
            log.error("getShipId Exception:{}", e);
        }
        return ResultUtil.success(value);
    }

MapUtils工具类:(把bean To Map)

package com.finance.cmp.dac.service.util;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import org.springframework.cglib.beans.BeanMap;


public class MapUtils {

	public static ConcurrentMap<String, BeanMap> beanMapCache = new ConcurrentHashMap<String, BeanMap>();

	public static BeanMap getBeanMap(Object object) {
		BeanMap beanMap = beanMapCache.get(object.getClass().getName());
		if (beanMap == null) {
			beanMap = BeanMap.create(object);
			beanMapCache.put(object.getClass().getName(), beanMap);
		}
		return beanMap;
	}

	// 如果使用BeanMap缓存,这个性能最好。
	public static Map<String, Object> beanToMap(Object object,Set sets) {

		BeanMap beanMap = getBeanMap(object);
		beanMap.setBean(object);
		@SuppressWarnings("unchecked")
		Map<String, Object> toMap = beanMap;
//
//		for (Entry<String, Object> entry : toMap.entrySet()) {
//			if (entry.getValue() != null) {
//					toMap.put(entry.getKey(), entry.getValue());
//			}
//		}
		Map<String, Object> resultmap=new HashMap<String, Object>();
		if(sets==null||sets.size()<1) {
			for (Entry<String, Object> entry : toMap.entrySet()) {
				if (entry.getValue() != null ) {
					resultmap.put(entry.getKey(), entry.getValue());
				}
			}
		}else{
			for (Entry<String, Object> entry : toMap.entrySet()) {
				if (entry.getValue() != null && !sets.contains(entry.getKey())) {
					resultmap.put(entry.getKey(), entry.getValue());
				}
			}
		}
		return resultmap;
	}
	
	
	
	
	
	public static Map ConvertObjToMap(Object obj){
		  Map<String,Object> reMap = new HashMap<String,Object>();
		  if (obj == null)
		   return null;
		  Field[] fields = obj.getClass().getDeclaredFields();
		  try {
		   for(int i=0;i<fields.length;i++){
		    try {
		     Field f = obj.getClass().getDeclaredField(fields[i].getName());
		     f.setAccessible(true);
		           Object o = f.get(obj);
		           reMap.put(fields[i].getName(), o);
		    } catch (NoSuchFieldException e) {
		     // TODO Auto-generated catch block
		     e.printStackTrace();
		    } catch (IllegalArgumentException e) {
		     // TODO Auto-generated catch block
		     e.printStackTrace();
		    } catch (IllegalAccessException e) {
		     // TODO Auto-generated catch block
		     e.printStackTrace();
		    }
		   }
		  } catch (SecurityException e) {
		   // TODO Auto-generated catch block
		   e.printStackTrace();
		  }
		  return reMap;
		 }
	@SuppressWarnings("rawtypes")
	public static Object convertMap(Class type, Map map)
			throws IntrospectionException, IllegalAccessException,
			InstantiationException, InvocationTargetException {
		BeanInfo beanInfo = Introspector.getBeanInfo(type); // 获取类属性
		Object obj = type.newInstance(); // 创建 JavaBean 对象

		// 给 JavaBean 对象的属性赋值
		PropertyDescriptor[] propertyDescriptors = beanInfo
				.getPropertyDescriptors();
		for (int i = 0; i < propertyDescriptors.length; i++) {
			PropertyDescriptor descriptor = propertyDescriptors[i];
			String propertyName = descriptor.getName();

			if (map.containsKey(propertyName)) {
				// 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。
				Object value = map.get(propertyName);

				Object[] args = new Object[1];
				args[0] = value;

				descriptor.getWriteMethod().invoke(obj, args);
			}
		}
		return obj;
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static <T> T map2Bean(T t, Map map) throws Exception {
		Class clazz = t.getClass();
		// 实例化类
		T entity = (T) clazz.newInstance();
		Set<String> keys = map.keySet();
		// 变量map 赋值
		for (String key : keys) {
			String fieldName = key;
			// 判断是sql 还是hql返回的结果
			if (key.equals(key.toUpperCase())) {
				// 获取所有域变量
				Field[] fields = clazz.getDeclaredFields();
				for (Field field : fields) {
					if (field.getName().toUpperCase().equals(key))
						fieldName = field.getName();
					break;
				}
			}
			// 设置赋值
			try {
				// 参数的类型 clazz.getField(fieldName)
				Class<?> paramClass = clazz.getDeclaredField(fieldName)
						.getType();
				// 拼装set方法名称
				String methodName = "set"
						+ fieldName.substring(0, 1).toUpperCase()
						+ fieldName.substring(1);
				// 根据名称获取方法
				Method method = clazz.getMethod(methodName, paramClass);
				// 调用invoke执行赋值
				method.invoke(entity, map.get(key));
			} catch (Exception e) {
				System.out.println(e.toString());
			}
		}

		return entity;
	}

	public static <T> T mapBind(Map map, T t) throws Exception {

		// 获得传入vo的Class方法
		Class newClass = t.getClass();
		// 得到vo中所有的成员变量
		Field[] fs = newClass.getDeclaredFields();
		// 方法变量
		String methodName = null;
		// map的value值
		Object mapValue = null;
		// 参数类型
		String parameterType = null;
		// 查找方法时需要传入的参数
		Class[] parameterTypes = new Class[1];
		// 执行invoke方法时需要传入的参数
		Object[] args = new Object[1];
		// 取得Map的迭代器
		Iterator it = map.keySet().iterator();
		while (it.hasNext()) {
			// 取出map的key值
			String key = (String) it.next();
			if (key != null) {
				for (int i = 0; i < fs.length; i++) {
					if (key.equals(fs[i].getName())) {
						// 拼set方法名
						methodName = "set"
								+ key.replaceFirst(key.substring(0, 1), key
										.substring(0, 1).toUpperCase());
						try {
							// 得到vo中成员变量的类型
							parameterTypes[0] = fs[i].getType();
							parameterType = parameterTypes[0].toString();
							// 找到vo中的方法
							Method method = newClass.getDeclaredMethod(
									methodName, parameterTypes);
							mapValue = map.get(key);
							// 下面代码都是参数类型是什么,如果有需求可以自行增加
							// 当set方法中的参数为int或者Integer
							if (parameterTypes[0] == Integer.class
									|| parameterTypes[0] == int.class) {
								if (mapValue instanceof Integer) {
									args[0] = mapValue;
								} else {
									args[0] = Integer
											.parseInt((String) mapValue);
								}
								// 当set方法中的参数为Date
							} else if (parameterTypes[0] == Date.class) {
								if (mapValue instanceof Date) {
									args[0] = mapValue;
								} else {
									SimpleDateFormat sdf = new SimpleDateFormat(
											"yyyy-MM-dd");
									args[0] = sdf.parse((String) mapValue);
								}
								// 当set方法中的参数为Float
							} else if (parameterTypes[0] == double.class
									|| parameterTypes[0] == Double.class) {
								if (mapValue instanceof Double) {
									args[0] = mapValue;
								} else {
									args[0] = Double
											.parseDouble((String) mapValue);
								}
								// 当set方法中的参数为其他
							} else if (parameterTypes[0] == String.class) {

								if (mapValue instanceof String[]) {

									String[] tempArray = (String[]) mapValue;
									String result = "";
									for (int m = 0; m < tempArray.length; m++) {
										result = result + tempArray[m] + ",";
									}
									result = result.substring(0,
											result.length() - 1);
									args[0] = result;

								} else {
									args[0] = (String) mapValue;
								}
							} else {
								args[0] = mapValue;
							}
							// 执行set方法存储数据
							method.invoke(t, args);

						} catch (SecurityException e) {
							throw new SecurityException("[mapBind]安全异常:" + e);
						} catch (NoSuchMethodException e) {
							throw new NoSuchMethodException(
									"[mapBind]Vo中无此方法异常" + e);
						} catch (IllegalArgumentException e) {
							throw new Exception("VO中" + key + "属性类型"
									+ parameterType + "与Map中值为" + mapValue
									+ "的类型不匹配");
						} catch (IllegalAccessException e) {
							throw new IllegalAccessException(
									"[mapBind]IllegalAccessException异常");
						} catch (ParseException e) {
							throw new ParseException(
									"[mapBind]ParseException异常", 0);
						}
					}
				}
			}
		}
		return t;
	}
	
	
	

}

3):seivice类:

a.serivce接口:参数为map 返回也为map
Map<String, Object> queryShipId(Map<String, Object> query);
b.service实现类:

 @Override
    public Map<String, Object> queryShipId(Map<String, Object> query) {
        log.info("query service : " + query);

        //一般把第三方的接口信息存在数据库
        List<TChannelApi> channelApis = (List<TChannelApi>) redisCacheService.get(Constant.REDIS_CHANNELAPI_PREFIX);
        for (TChannelApi t : channelApis) {
            if (t.getApiName().equals("apicall/QueryShip")) {
                log.info("url : " + t.getApiFullUrl());
                query.put("url", t.getApiFullUrl());
                query.put("apiId", t.getId());
                query.put("channelCode", t.getChannelCode());
            }
        }
        //正在的调三方
        Object obj = queryShipXyDataService.queryShipId(query);
        log.info("result Object :" + obj);
        Map<String, Object> mapRe = (Map<String, Object>) obj;

        return mapRe;
    }

c.真正调: 使用RestTemplate http方式

 @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private TDataServiceResultMapper tDataServiceResultMapper;
    @Autowired
    private TLogSubscriberMapper tLogSubscriberMapper;

    @Override
    public Map<String, Object> queryShipId(Map<String, Object> query) {
        log.info("query third : " + query);
        Map<String, Object> resultMap = new HashMap<>();
        String url = query.get("url") + "";
        log.info("query third url: " + url);
        String kw = query.get("kw") + "";
        log.info("query third kw: " + kw);
        String v = query.get("v") + "";
        log.info("query third kw: " + v);
        String k = query.get("k") + "";
        log.info("query third k: " + k);
        String enc = query.get("enc") + "";
        log.info("query third enc: " + enc);
        Integer apiId = Integer.parseInt(query.get("apiId") + "");
        log.info("query third apiId: " + apiId);
        String channelCode = query.get("channelCode") + "";
        log.info("query third channelCode: " + channelCode);
        HttpHeaders hd = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        hd.setContentType(type);
        //传递参数
        JSONObject json = new JSONObject();
        long timeTemp = System.currentTimeMillis();
        json.put("v", v);
        json.put("k", k);
        json.put("kw", kw);
        json.put("enc", enc);
        HttpEntity<String> entity = new HttpEntity<>(json.toString(), hd);
        ResponseEntity<String> resultEntity = restTemplate.exchange(url, HttpMethod.POST, entity, String.class, new HashMap<String, Object>());
        String reultObj = resultEntity.getBody();
        log.info("query third result : " + reultObj);
        JSONObject result = JSONObject.parseObject(reultObj);
        //data是个数组则用JSONArray接受,不是数组则用JSONObject
        JSONArray result1 = result.getJSONArray("data");

//把请求结果存入请求表中记录
        TLogSubscriber logSubscriber = new TLogSubscriber();
        logSubscriber.setChannelApiId(apiId.toString());
        logSubscriber.setRequestNo(String.valueOf(System.currentTimeMillis()));
        logSubscriber.setApiFullUrl(url);
        logSubscriber.setRequestData(query.toString());
        logSubscriber.setStatus("Y");
        logSubscriber.setCreateTime(new Date());
        logSubscriber.setApiType("http");
        int logRe = tLogSubscriberMapper.insert(logSubscriber);
        if (logRe > 0) {
            log.info("增加请求记录表到 mysql成功...");

        }
//另外一张记录表
        TDataServiceResult dataServiceResult = new TDataServiceResult();
        dataServiceResult.setIdentityNo(logSubscriber.getId().toString());
        dataServiceResult.setChannelCode(channelCode);
        dataServiceResult.setChannelApiId(apiId);
        dataServiceResult.setJsonDetail(result1.toJSONString());
        dataServiceResult.setStatus("Y");
        int insert = tDataServiceResultMapper.insert(dataServiceResult);
        if (insert > 0) {
            log.info("增加查询ShipID json数据到mysql成功...");
            }
        resultMap.put("data", result1);
        return resultMap;
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot 是一个用于创建和部署独立的、基于生产级别的Spring应用程序的框架。它简化了以往使用Spring框架所需的大量配置,并提供了自动化的依赖管理和容器配置。 MyBatis 是一个优秀的持久化框架,它可以简化数据库操作并提供了强大的SQL语句管理和映射功能。通过MyBatis,我们可以使用简洁的XML或注解来描述数据库映射关系,实现与数据库的交互。 Vue 是一套用于构建用户界面的渐进式JavaScript框架。它拥有响应式数据绑定和组件化的架构,可以帮助我们更快速、高效地开发交互式的前端应用程序。 一个基于Spring Boot、MyBatis和Vue的系统实现可以如下进行: 1. 在Spring Boot中,我们可以使用Spring Initializr快速生成一个基础项目,添加Spring Boot和MyBatis相关的依赖项。 2. 创建Java实体类,用于映射数据库表结构。可以使用注解或XML配置文件定义实体类的属性和数据库字段的映射关系。 3. 编写MyBatis的映射文件或注解,实现数据库操作的CRUD功能。可以使用MyBatis的动态SQL语句,根据实际需要灵活构建查询条件。 4. 在Spring Boot中配置数据源和MyBatis相关的属性,使其能够正确地连接和操作数据库。 5. 创建Spring Boot的控制器,处理前端请求调用MyBatis的相应方法进行数据库操作。可以使用@RestController注解定义RESTful API接口。 6. 在Vue中创建组件,用于展示和接收用户的界面操作。可以使用Vue的数据绑定和组件化特性,实现页面的动态更新和交互。 7. 使用Vue的路由功能,实现前端页面的导航和页面切换。可以通过定义不同的路由规则,让用户能够在不同的页面间进行导航。 8. 发布项目时,使用Spring Boot提供的打包工具将系统打包为可执行的JAR文件,并部署到服务器上。 通过以上步骤,我们可以基于Spring Boot、MyBatis和Vue实现一个完整的系统。Spring Boot负责处理后端的业务逻辑和数据库操作,MyBatis负责与数据库进行交互,Vue负责构建交互式的前端界面。整体架构简洁清晰,开发效率提高,系统性能良好。 ### 回答2: SpringBoot是一个易于上手的Java开发框架,可以快速搭建稳定高效的Web应用程序。它提供了自动化配置和默认约定来简化开发过程,并成了许多常用的第三方库和工具,如MyBatisMyBatis是一种流行的持久层框架,用于将Java对象和关系数据库之间进行映射。它通过提供一个简单的、方便的方式来执行SQL查询和更新,从而实现了数据的持久化。在SpringBoot中使用MyBatis,可以通过注解或XML文件来定义数据库操作,并结合MyBatis的动态SQL功能,实现灵活的数据库访问。 Vue是一个轻量级的JavaScript框架,用于构建用户界面。它采用组件化的开发模式,将页面拆分成多个可重用的组件,使得前端开发更加高效和模块化。Vue还提供了响应式的数据绑定和虚拟DOM技术,可以快速地构建交互式的单页应用。 在一个系统中,可以使用SpringBoot + MyBatis + Vue的组合来完成各个层面的功能。SpringBoot作为后端框架,负责处理业务逻辑,提供RESTful API接口,并通过MyBatis数据库进行交互。MyBatis则负责将Java对象和数据库之间进行映射,执行SQL查询和更新操作。 而Vue作为前端框架,负责渲染页面、处理用户交互,并通过调用后端提供的API接口获取和提交数据。Vue通过组件化的方式来构建页面,每个组件负责渲染一个部分,最终组合成完整的页面。 在实现过程中,可以使用Vue的路由功能来实现前端页面的导航和跳转,通过axios等网络请求库与后端进行数据交互。同时,可以利用SpringBoot的自动化配置和注解功能来简化后端开发,提高开发效率。通过整合SpringBootMyBatis和Vue,可以快速搭建一个稳定高效的系统,实现业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值