一、关于JSON类型字段的处理

1、数据库表中某一个定义了一个JSON类型,映射文件中应该如何来对该JSON类型进行解析,以及要对该JSON类型的字段进行模糊查询,SQL语句应该如何进行设计?

1.1 定义了一个JSON类型

  1. `order_json` json NOT NULL COMMENT '关联订单单号';
  2. // 注:JSON类型的字段在本地执行该SQL时,不能有默认值

1.2 映射文件中应该如何来对该JSON类型进行解析

  1. <result column="order_json" jdbcType="CHAR" property="orderJson" />

1.3 对该JSON类型的字段进行模糊查询,SQL语句应该如何进行设计?

  1. 注:sql描述:在agent_profit_info查询order_json字段中属性为orderNo所对应的值是否包含#{param.orderNo}
  2. select order_json from agent_profit_info where json_extract(order_json,'$[*].orderNo') like concat('%',#{param.orderNo},'%');
  3. 格式:select 字段名(不限于是一个字段) from 表名 where json_extract(json类型字段, '$[*].orderNO') like concat('%', #{param.orderNo}, '%');
  4. 注:
  5. $[*]:表示的是数组类型,例如json格式是:[{"orderId": "1", "orderNo": "AA"}, {"orderId": "2", "orderNo": "AB"}]

1.3.1 如何转换为这样的JSON格式:[{“orderId”: “1”, “orderNo”: “AA”}, {“orderId”: “2”, “orderNo”: “AB”}]

  1. /**
  2. * @Description TODO
  3. * @Author dongxinxin@e6yun.com
  4. * @Created Date: 2022/3/25 8:59
  5. * @ClassName JSONArrTest
  6. * @Remark
  7. */
  8. public class JSONArrTest {
  9. public static void main(String[] args) {
  10. OrderJson obj1 = new OrderJson("001","123456");
  11. OrderJson obj2 = new OrderJson("002","456789");
  12. List<OrderJson> list = new ArrayList<>();
  13. list.add(obj1);
  14. list.add(obj2);
  15. System.out.println("list集合转换为JSON:" + JSON.toJSONString(list));
  16. // list集合转换为JSON:[{"orderId":"001","orderNo":"123456"},{"orderId":"002","orderNo":"456789"}]
  17. }
  18. }
  19. /**
  20. * @Author dongxinxin@e6yun.com
  21. * @Description // 定义一个对象:属性根据自己的需要进行设定 先我定义两个属性 orderId、orderNo
  22. * @Date 2022/3/25 8:59
  23. * @ClassName OrderJson
  24. * @return
  25. **/
  26. @Data
  27. @ToString
  28. @NoArgsConstructor
  29. @AllArgsConstructor
  30. class OrderJson {
  31. String orderId;
  32. String orderNo;
  33. }
  34. 依赖:
  35. <dependency>
  36. <groupId>com.alibaba</groupId>
  37. <artifactId>fastjson</artifactId>
  38. <version>1.2.74</version>
  39. </dependency>

二、通过承运商ID或者客户ID如何在缓存中获取所对应的名字

  1. // 通过缓存获取承运商的名字
  2. List<String> carrierList = (List<String>)map.get("carrierList");
  3. Map<String, String> carrierMap = CacheOperationUtils.conversionCacheMap(
  4. CacheKeyPrefixEnum.BASE_CARRIER_MAP,
  5. CurrentUserHolder.getCurrentUser(),
  6. carrierList);
  7. // 通过缓存获取客户的名字
  8. List<String> customerList = (List<String>)map.get("customerList");
  9. Map<String, String> customerMap = CacheOperationUtils.conversionCacheMap(
  10. CacheKeyPrefixEnum.BASE_CUSTOMER_MAP,
  11. CurrentUserHolder.getCurrentUser(),
  12. customerList);

三、如何获取运单的状态

  1. // map 中第一个属性是:运单状态的ID 第二个属性是一个订单ID所对应的运单状态的枚举
  2. Map<Integer, WaybillMainStatusEnum> mainStatusEnumMap = WaybillMainStatusEnum.mainStatusEnumMap;

注:数据库表如何进行存储
image.png

四、通过反射并利用注解的方式进行进行获取表头属性

1、javaBean实体类

  1. /**
  2. * Database Column Remarks:
  3. * 应付运费费结算对象
  4. *
  5. * This field was generated by MyBatis Generator.
  6. * This field corresponds to the database column agent_profit_info.pay_waybill_account
  7. *
  8. * @mbg.generated Mon Mar 21 10:05:01 CST 2022
  9. */
  10. @JSONField(name = "应付运费结算对象")
  11. private String payWaybillAccount;
  12. /**
  13. * Database Column Remarks:
  14. * 应付保险费
  15. *
  16. * This field was generated by MyBatis Generator.
  17. * This field corresponds to the database column agent_profit_info.pay_premium_fee
  18. *
  19. * @mbg.generated Mon Mar 21 10:05:01 CST 2022
  20. */
  21. @JSONField(name = "应付保险费")
  22. private BigDecimal payPremiumFee;

2、利用反射获取表头名的方式

  1. // 反射获取导出字段名。AgentProfitExportInfoVO 存放的时要导出的表头
  2. static {
  3. // 1、获取 AgentProfitExportInfoVO Class对象
  4. Class<AgentProfitExportInfoVO> agentProfitExportInfoVOClass = AgentProfitExportInfoVO.class;
  5. // 2、再通过 getDeclaredFields() 方法获取 AgentProfitExportInfoVO 类中的所有属性
  6. Field[] declaredFields = agentProfitExportInfoVOClass.getDeclaredFields();
  7. for (Field declaredField : declaredFields) {
  8. declaredField.setAccessible(true);
  9. // 3、通过注解的方式进行获取确定的表头名,并存放到 hashMap 中
  10. JSONField annotation = declaredField.getAnnotation(JSONField.class);
  11. if(Objects.nonNull(annotation) && StringUtils.isNotBlank(annotation.name())) {
  12. hashMap.put(declaredField.getName(), annotation.name());
  13. }
  14. }
  15. }

五、map通过流的获取

  1. //toMap中两个参数,第一个是键,第二个是值
  2. return contractFeeVO.getFeeItems().stream().collect(Collectors.toMap(FeeItemVO::getFeeItemId, Function.identity()));