Administrator
发布于 2024-06-13 / 17 阅读
0
0

2024 新项目开发问题日志记录2

1.mybatis查询返回map类型取值问题`

Map<Integer, Map<String, Integer>> cameraCount = mntCameraService.getCameraCount();

在得到cameraCount后,想取Map<String, Integer>中的value值

用cameraCount.get(key).get(key);
报java.lang.Long cannot be cast to java.lang.Integer,即第二个get取值时报转换异常
然而我的数据类型都是Integer,并没有long类型,怀疑为mybatis返回的值为long,但map的value
已经定为Integer,既然能封装数据应该不是这个问题。

解决补充:
屏幕截图 2024-06-18 143049(1).png

返回的格式设置为 Map<String,Map<x,x>>,因为返回的格式明显是map类型,所以返回值的value也应该是key

解决

1.使用 Number 类型进行泛型处理(目前使用方法)
Map<Integer, Map<String, Number>> cameraCount = mntCameraService.getCameraCount();
Number count = countInfo.get("xxx");
count.intValue()

2.确定返回的是long类型,那么直接改为long,之后需要再转,我并不确定,也没试试
Map<Integer, Map<String, Long>> cameraCount = mntCameraService.getCameraCount();

3.通用类型转换
Map<Integer, Map<String, Object>> cameraCount = mntCameraService.getCameraCount();
Object countObj = countInfo.get("xxxx");
int count = ((Number) countObj).intValue();

2.RedisTemplate使用

RedisTemplate实际的使用比较少,仅有某些数据是基本不变且固定的,前端又可能反复调用
接口查询回显,故记录使用,以及补充查询如何使用的链接

http://t.csdnimg.cn/nQWfe
http://t.csdnimg.cn/5c4JJ

思路,因为回显的数据不止一条,且有可能有批量删除的情况,而在查询回显的时候又是返回一个集合,所以我选择使用列表(List)存储数据。

1.查询时,先查缓存
//range() 方法的第二个参数是起始索引,这里设为 0 表示从列表的第一个元素开始,
//第三个参数 -1 表示获取到列表的最后一个元素,即获取整个列表的所有元素。
redisTemplate.opsForList().range(key, 0, -1);  

2.缓存没有数据,查询数据库并加入缓存
//Long rightPushAll(K key, V value)将 values 列表中的元素从列表的右侧插入到 Redis 中
//指定键 key 的列表中。
redisTemplate.opsForList().rightPushAll(BRAND_KEY, brandList);

3.更新或新增时
//更新前将之前的value移除
redisTemplate.opsForList().remove(BRAND_KEY, 0, value);
//更新或新增后,右侧插入,key 不存在时,自动创建
redisTemplate.opsForList().rightPush(BRAND_KEY, value)

4.删除时
//由于删除时前端只传入id值,如想移除redis中的value的话,还得从数据库中查询出对象来
//加之总体加入缓存的数据量不多,删除操作少。故而选择删掉整个key
redisTemplate.delete(BRAND_KEY);

评论