一、关于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
@AllArgsConstructor
class 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()));