Redis实战(黑马点评--转换对象结构例子)
短信注册登录
验证码核对通过,保存用户dto到redis(string泛型规范)时的工具方法。
//工具方法:
UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
Map<String, Object> userMap = BeanUtil.beanToMap(userDTO,new HashMap<>(), CopyOptions.create() .setIgnoreNullValue(true) .setFieldValueEditor((fieldName,fieldValue)->fieldValue.toString()));
//7.3存储 stringRedisTemplate<String,String>最终要转为string存储,但map里面有为long型的,不能自动转,需要自己提前手动改一下。 stringRedisTemplate.opsForHash().putAll(LOGIN_USER_KEY +token,userMap);
数据库模型(对象)到redis存储
从数据库查到的对象,用JSONUtil.toJsonStr(对象)转字符串缓存至Redis。
stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop));
redis的zset集合中取出数据,转化为dto进行返回
@Override public Result queryBlogLikes(Integer id) { String key = BLOG_LIKED_KEY + id; //zrange key 0 4 查询zset中前5个元素 Set<String> top5 = stringRedisTemplate.opsForZSet().range(key, 0, 4); //如果是空的(可能没人点赞),直接返回一个空集合 if (top5 == null || top5.isEmpty()) { return Result.ok(Collections.emptyList()); } List<Long> ids = top5.stream().map(Long::valueOf).collect(Collectors.toList()); //将ids使用`,`拼接,SQL语句查询出来的结果并不是按照我们期望的方式进行排 //所以我们需要用order by field来指定排序方式,期望的排序方式就是按照查询出来的id进行排序 String idsStr = StrUtil.join(",", ids); //select * from tb_user where id in (ids[0], ids[1] ...) order by field(id, ids[0], ids[1] ...) List<UserDTO> userDTOS = userService.query().in("id", ids) //调用userService的query方法来获取一个可用于数据库查询的对象。这通常在某些ORM框架中见到,例如MyBatis-Plus。 .last("order by field(id," + idsStr + ")") // 添加一个最后的排序条件到查询中。这个条件使用了SQL的FIELD函数来根据idsStr列表中的顺序对ID进行排序。这意味着查询结果中的用户将按照他们在idsStr中出现的顺序进行排序。 .list().stream() //执行查询并获取结果列表。将查询结果转换为Java 8的Stream,以便进行后续的流式处理。 .map(user -> BeanUtil.copyProperties(user, UserDTO.class)) //将查询结果转换为Java 8的Stream,以便进行后续的流式处理。 .collect(Collectors.toList()); //将Stream中的元素收集到一个列表中,并返回这个列表。 return Result.ok(userDTOS); }
总之,这段代码的目的是从数据库中 1查询具有指定ID的用户,2并按照给定的ID顺序对它们进行排序,3然后将这些用户转换为UserDTO对象的列表。
在MyBatis-Plus中,last()
方法的参数是SQL语句。它允许你在已经构建的SQL语句基础上添加最后的SQL片段。该方法的使用场景通常是在需要自定义SQL语句的一部分,同时保留MyBatis-Plus自动生成的其他部分时使用。
使用场景:
- 分页查询:当你使用MyBatis-Plus进行分页查询时,可以使用
last()
方法添加自定义的排序规则或限制结果集大小的语句片段。例如,你可以在last()
方法中传递类似ORDER BY create_time DESC LIMIT 10
的语句,以按创建时间倒序排序并限制结果集大小为10。 - 动态条件查询:如果你需要根据动态条件构建查询语句,可以使用
last()
方法添加自定义的查询条件。例如,你可以根据用户输入的搜索关键词动态生成类似WHERE name LIKE '%keyword%'
的语句片段,并将其传递给last()
方法,以在查询中添加该条件。 - 多表关联查询:当你需要进行多表关联查询时,可以使用
last()
方法添加自定义的关联条件和查询字段。例如,你可以传递类似JOIN other_table ON main_table.id = other_table.main_id
的语句片段,以实现自定义的关联查询。
需要注意的是,在使用last()方法时,你仍然需要谨慎处理SQL注入等安全问题,确保传递给方法的SQL片段是经过合适的过滤和转义处理的。
在 SQL 中,FIELD 函数通常用于字符串处理和文本分析。它用于在文本中查找一个或多个指定的值,并返回它们的位置。
FIELD 函数的语法:FIELD(value, text)
value 是要查找的值,text 是要在其中查找的文本。
FIELD 函数返回一个整数,表示找到的值在文本中的位置。如果值未找到,则返回 0。
在Java中,将集合转换为流(Stream)后,你可以利用流式编程(Stream Programming)的方式进行更高级的操作。流式编程是一种用于处理数据序列的编程模式,它允许你以声明性方式处理数据。这意味着你可以描述你想要做什么,而不是详细说明怎么做。
当你将集合转换为流后,你可以执行以下操作:
- 过滤:通过流过滤出符合特定条件的元素。
- 映射:将流中的每个元素映射为另一个元素。
- 归约:将流中的元素组合为一个单一的结果。
- 收集:将流中的元素收集到一个集合或其他数据结构中。
- 遍历:按顺序处理流中的每个元素。
- 找到:查找流中的第一个满足特定条件的元素。
- 任何:检查流中是否有任何一个元素满足特定条件。
- 全部:检查流中的所有元素是否满足一组条件。
- 收集统计信息:例如,计算流的长度,查找最大或最小元素等。
- 转换为其他数据结构:例如,将Stream转换为List或Set。
.filter(fruit -> fruit.length() > 5); // 过滤出长度大于5的水果
.map(function) //function
是一个用于映射元素的函数。函数可以是一个方法引用、Lambda表达式或方法对象。下面是一些使用map()方法的示例:
-
使用方法引用来映射流中的字符串:
List<String> names = Arrays.asList("John", "Jane", "Peter"); List<String> upperCaseNames = names.stream().map(String::toUpperCase).collect(Collectors.toList()); System.out.println(upperCaseNames); // 输出: [JOHN, JANE, PETER] -
使用Lambda表达式来映射流中的整数:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<String> numberNames = numbers.stream().map(n -> n > 3 ? "Even" : "Odd").collect(Collectors.toList()); System.out.println(numberNames); // 输出: [Odd, Odd, Even, Even, Even] -
使用方法对象来映射流中的数组:
Integer[] numbers = {1, 2, 3, 4, 5}; List<Integer> numberSquares = Arrays.stream(numbers).map(n -> n * n).collect(Collectors.toList()); System.out.println(numberSquares); // 输出: [1, 4, 9, 16, 25] 这些示例展示了如何使用map()方法来将流中的元素映射到另一个元素。你可以根据需要使用不同的函数来进行映射。
-
想都是问题,做都是答案,站着不动永远是观众。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)