一、关于JSON类型字段的处理
1、数据库表中某一个定义了一个JSON类型,映射文件中应该如何来对该JSON类型进行解析,以及要对该JSON类型的字段进行模糊查询,SQL语句应该如何进行设计?
1.1 定义了一个JSON类型
`order_json` json NOT NULL COMMENT '关联订单单号';// 注:JSON类型的字段在本地执行该SQL时,不能有默认值
1.2 映射文件中应该如何来对该JSON类型进行解析
<result column="order_json" jdbcType="CHAR" property="orderJson" />
1.3 对该JSON类型的字段进行模糊查询,SQL语句应该如何进行设计?
注:sql描述:在agent_profit_info查询order_json字段中属性为orderNo所对应的值是否包含#{param.orderNo}select order_json from agent_profit_info where json_extract(order_json,'$[*].orderNo') like concat('%',#{param.orderNo},'%');格式:select 字段名(不限于是一个字段) from 表名 where json_extract(json类型字段, '$[*].orderNO') like concat('%', #{param.orderNo}, '%');注: $[*]:表示的是数组类型,例如json格式是:[{"orderId": "1", "orderNo": "AA"}, {"orderId": "2", "orderNo": "AB"}]
1.3.1 如何转换为这样的JSON格式:[{“orderId”: “1”, “orderNo”: “AA”}, {“orderId”: “2”, “orderNo”: “AB”}]
/** * @Description TODO * @Author dongxinxin@e6yun.com * @Created Date: 2022/3/25 8:59 * @ClassName JSONArrTest * @Remark */public class JSONArrTest { public static void main(String[] args) { OrderJson obj1 = new OrderJson("001","123456"); OrderJson obj2 = new OrderJson("002","456789"); List<OrderJson> list = new ArrayList<>(); list.add(obj1); list.add(obj2); System.out.println("list集合转换为JSON:" + JSON.toJSONString(list));// list集合转换为JSON:[{"orderId":"001","orderNo":"123456"},{"orderId":"002","orderNo":"456789"}] }}/** * @Author dongxinxin@e6yun.com * @Description // 定义一个对象:属性根据自己的需要进行设定 先我定义两个属性 orderId、orderNo * @Date 2022/3/25 8:59 * @ClassName OrderJson * @return **/@Data@ToString@NoArgsConstructor@AllArgsConstructorclass OrderJson { String orderId; String orderNo;}依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.74</version> </dependency>
二、通过承运商ID或者客户ID如何在缓存中获取所对应的名字
// 通过缓存获取承运商的名字List<String> carrierList = (List<String>)map.get("carrierList");Map<String, String> carrierMap = CacheOperationUtils.conversionCacheMap( CacheKeyPrefixEnum.BASE_CARRIER_MAP, CurrentUserHolder.getCurrentUser(), carrierList);// 通过缓存获取客户的名字List<String> customerList = (List<String>)map.get("customerList");Map<String, String> customerMap = CacheOperationUtils.conversionCacheMap( CacheKeyPrefixEnum.BASE_CUSTOMER_MAP, CurrentUserHolder.getCurrentUser(), customerList);
三、如何获取运单的状态
// map 中第一个属性是:运单状态的ID 第二个属性是一个订单ID所对应的运单状态的枚举Map<Integer, WaybillMainStatusEnum> mainStatusEnumMap = WaybillMainStatusEnum.mainStatusEnumMap;
注:数据库表如何进行存储
四、通过反射并利用注解的方式进行进行获取表头属性
1、javaBean实体类
/** * Database Column Remarks: * 应付运费费结算对象 * * This field was generated by MyBatis Generator. * This field corresponds to the database column agent_profit_info.pay_waybill_account * * @mbg.generated Mon Mar 21 10:05:01 CST 2022 */ @JSONField(name = "应付运费结算对象") private String payWaybillAccount; /** * Database Column Remarks: * 应付保险费 * * This field was generated by MyBatis Generator. * This field corresponds to the database column agent_profit_info.pay_premium_fee * * @mbg.generated Mon Mar 21 10:05:01 CST 2022 */ @JSONField(name = "应付保险费") private BigDecimal payPremiumFee;
2、利用反射获取表头名的方式
// 反射获取导出字段名。AgentProfitExportInfoVO 存放的时要导出的表头static { // 1、获取 AgentProfitExportInfoVO Class对象 Class<AgentProfitExportInfoVO> agentProfitExportInfoVOClass = AgentProfitExportInfoVO.class; // 2、再通过 getDeclaredFields() 方法获取 AgentProfitExportInfoVO 类中的所有属性 Field[] declaredFields = agentProfitExportInfoVOClass.getDeclaredFields(); for (Field declaredField : declaredFields) { declaredField.setAccessible(true); // 3、通过注解的方式进行获取确定的表头名,并存放到 hashMap 中 JSONField annotation = declaredField.getAnnotation(JSONField.class); if(Objects.nonNull(annotation) && StringUtils.isNotBlank(annotation.name())) { hashMap.put(declaredField.getName(), annotation.name()); } }}
五、map通过流的获取
//toMap中两个参数,第一个是键,第二个是值return contractFeeVO.getFeeItems().stream().collect(Collectors.toMap(FeeItemVO::getFeeItemId, Function.identity()));