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自动生成的其他部分时使用。

使用场景:

  1. 分页查询:当你使用MyBatis-Plus进行分页查询时,可以使用last()方法添加自定义的排序规则或限制结果集大小的语句片段。例如,你可以在last()方法中传递类似ORDER BY create_time DESC LIMIT 10的语句,以按创建时间倒序排序并限制结果集大小为10。
  2. 动态条件查询:如果你需要根据动态条件构建查询语句,可以使用last()方法添加自定义的查询条件。例如,你可以根据用户输入的搜索关键词动态生成类似WHERE name LIKE '%keyword%'的语句片段,并将其传递给last()方法,以在查询中添加该条件。
  3. 多表关联查询:当你需要进行多表关联查询时,可以使用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)的方式进行更高级的操作。流式编程是一种用于处理数据序列的编程模式,它允许你以声明性方式处理数据。这意味着你可以描述你想要做什么,而不是详细说明怎么做。

当你将集合转换为流后,你可以执行以下操作:

  1. 过滤:通过流过滤出符合特定条件的元素。
  2. 映射:将流中的每个元素映射为另一个元素。
  3. 归约:将流中的元素组合为一个单一的结果。
  4. 收集:将流中的元素收集到一个集合或其他数据结构中。
  5. 遍历:按顺序处理流中的每个元素。
  6. 找到:查找流中的第一个满足特定条件的元素。
  7. 任何:检查流中是否有任何一个元素满足特定条件。
  8. 全部:检查流中的所有元素是否满足一组条件。
  9. 收集统计信息:例如,计算流的长度,查找最大或最小元素等。
  10. 转换为其他数据结构:例如,将Stream转换为List或Set。
    复制代码
    .filter(fruit -> fruit.length() > 5); // 过滤出长度大于5的水果  
    .map(function) //function是一个用于映射元素的函数。函数可以是一个方法引用、Lambda表达式或方法对象。

    下面是一些使用map()方法的示例:

    1. 使用方法引用来映射流中的字符串:

    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]
    1. 使用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]
    1. 使用方法对象来映射流中的数组:

    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()方法来将流中的元素映射到另一个元素。你可以根据需要使用不同的函数来进行映射。

    复制代码
posted @   Anne起飞记  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示