Java 代码解析:查询状态方法详解
这段 Java 代码是一个查询状态的方法,它接收三个参数:'type'(类型)、'startDate'(开始日期)和 'endDate'(结束日期)。
首先,它创建一个 YltStatusVo 对象(一个值对象),然后根据传入的日期参数格式化开始时间和结束时间。如果 'endDate' 为空,则默认为当前时间。
接下来,它从 Redis 缓存中获取 'type'、开始时间和结束时间对应的 YltStatusVo 对象,如果缓存中存在,则直接返回。否则,它调用 statusQuoMapper 对象的 queryStatusNum 方法查询状态数量,并将结果转换为 Map 类型。
然后,它将修复总数、合格总数、不合格总数、有效案件总数和全部案件总数设置到 YltStatusVo 对象中。接下来,它调用 statusQuoMapper 对象的 queryActiveAndAll 方法查询有效和全部案件数据,并将结果设置到 YltStatusVo 对象中。
最后,它计算案件修复率并将 YltStatusVo 对象存储到 Redis 缓存中,并返回 YltStatusVo 对象。
代码示例:
public YltStatusVo queryStatusQuo(String type, Date startDate, Date endDate) {
YltStatusVo yltStatusVo = new YltStatusVo();
//结束时间为空默认为当前时间,并格式化为yyyyMMdd
String endTime = DateUtil.format(ObjectUtil.isEmpty(endDate) ? new Date() : endDate, DatePattern.PURE_DATE_PATTERN);
String startTime = DateUtil.format(ObjectUtil.isEmpty(startDate) ? DateUtil.lastMonth() : startDate, DatePattern.PURE_DATE_PATTERN);
YltStatusVo yltStatusVoCache = redisTemplate.opsForValue().get(type + StringPool.UNDERSCORE + startTime + StringPool.UNDERSCORE + endTime);
if (ObjectUtil.isNotEmpty(yltStatusVoCache)) {
return yltStatusVoCache;
}
List<YltStatusBo> yltStatusBos = statusQuoMapper.queryStatusNum(type, startTime, endTime);
Map<String, Integer> statusNumMap = CollStreamUtil.toMap(yltStatusBos, YltStatusBo::getType, YltStatusBo::getNum);
//修复总数
yltStatusVo.setRepairTotal(statusNumMap.getOrDefault("修复", 0));
//合格总数
yltStatusVo.setQualifiedTotal(statusNumMap.getOrDefault("合格", 0));
//不合格总数
yltStatusVo.setUnqualifiedTotal(statusNumMap.getOrDefault("不合格", 0));
//查询有效及全部案件数据
YltActiveAndAllBo yltActiveAndAllBo = statusQuoMapper.queryActiveAndAll(type, startTime, endTime);
//有效案件
yltStatusVo.setEffectiveTotal(yltActiveAndAllBo.getActiveNum());
//全部案件
yltStatusVo.setCaseTotal(yltActiveAndAllBo.getAllNum());
//计算案件修复率
if (yltActiveAndAllBo.getActiveNum() != 0) {
BigDecimal result = NumberUtil.div(yltStatusVo.getRepairTotal(), yltActiveAndAllBo.getActiveNum());
yltStatusVo.setRepairRate(NumberUtil.formatPercent(Convert.toDouble(result), 2));
}else {
yltStatusVo.setRepairRate("0%");
}
redisTemplate.opsForValue().set(type + StringPool.UNDERSCORE + startTime + StringPool.UNDERSCORE + endTime, yltStatusVo, 300, TimeUnit.SECONDS);
return yltStatusVo;
}
代码分析:
- 参数接收: 方法接收三个参数:
type、startDate和endDate,用于指定查询条件。 - 日期格式化: 使用
DateUtil.format方法将startDate和endDate格式化为yyyyMMdd格式的字符串。 - Redis缓存: 从 Redis 缓存中获取对应
type、startTime和endTime的YltStatusVo对象,如果缓存存在则直接返回。 - 数据库查询: 如果缓存中没有找到数据,则调用
statusQuoMapper对象的queryStatusNum和queryActiveAndAll方法从数据库中查询状态数量和有效/全部案件数据。 - 数据处理: 将查询结果填充到
YltStatusVo对象中,包括修复总数、合格总数、不合格总数、有效案件总数、全部案件总数和案件修复率。 - 缓存更新: 将查询结果存储到 Redis 缓存中,并设置缓存过期时间为 300 秒。
- 返回结果: 返回填充好的
YltStatusVo对象。
结论: 这段代码展示了一个使用 Redis 缓存优化状态查询性能的示例,它通过缓存查询结果来减少数据库访问次数,提升系统响应速度。代码中使用 DateUtil、ObjectUtil 和 CollStreamUtil 等工具类来简化日期处理、对象判断和集合操作,提高代码可读性和可维护性。
原文地址: http://www.cveoy.top/t/topic/ohci 著作权归作者所有。请勿转载和采集!