【JavaWeb】【瑞吉外卖】分页操作&数据传输转换

瑞吉day3

搞定了分页以及数据传输的问题

mybatis-plus分页接口实现

分页主要是通过mybatis提供的接口实现的。这篇笔记只是记录如何实现这个接口,并不会深究原理。

博主也比较菜,目前还没有手撕mybatis代码,后续有机会研究一下(又挖了个坑,哈哈)

实现过程:

  1. 编写一个mybatis配置类
  2. 编写controller接口,输入俩:page下标与pagesize。返回为一个Page对象。

首先,实现分页接口,需要配置一个mybatis的类,并且注入到spring里面去,至于干嘛用的暂时不知道。但作用看起来就是注入了一个关于分页的interceptor进去。

剩下内部细节看代码

java 复制代码
// 记得要加这两个注解,注入到spring里面去。
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }

}

controller

java 复制代码
    /**
     * 分页查询的接口
     * @param page          页面下表
     * @param pageSize      一页的数据条数
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page, int pageSize,String name){
        log.info("page={}, pageSize={}, name={}", page, pageSize, name);

        // 1. 将传输过来的两个参数封装到Page对象里
        // 注意这个Page对象是mybatis-plus里的
        Page pageInfo = new Page(page, pageSize);

        // 2. 构造querywrapper生成器
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();

        // 3. 这里只是写了一个鉴别,可以暂时忽略
        queryWrapper.like(StringUtils.isNotEmpty(name), Employee::getName, name);

        // 4. 这里规定了一下根据更新时间排序
        queryWrapper.orderByDesc(Employee::getUpdateTime);

        // 5. 最后调一下接口,参数就是一开始的Page对象与构造的wrapper
        // 最终结果会放到Page对象里面
        employeeService.page(pageInfo, queryWrapper);

        return R.success(pageInfo);
    }

数据转换

做完了发现有一个问题。

由于一开始在Java里的类的ID字段是通过雪花算法生成的,且字段类型为long类型。

这个在Java内部是没有问题的,可以正常表示。

但最终传输到前端会出现问题,因为JS并不能表示那么高的整型精度,所以会有精度损失,导致传输错误。

这里黑马给出的一个解决办法是直接将传输的类型变成string类型传输出去。

但怎么改呢?

修改思路是在传输发送出去加一层,将所有long类型转换成string类型。

当然也是直接抄别人就行。

依旧暂不深究原理,只研究怎么实现。

实现过程:

  1. 编写JackonMap类,定义一下转换规则
  2. 去config里面重写一下extendMessageConverters方法,将刚才的mapping加到转换器里就好啦
java 复制代码
/**
 * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
 * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
 */
public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);


        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))

                .addSerializer(BigInteger.class, ToStringSerializer.instance)
                .addSerializer(Long.class, ToStringSerializer.instance)
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}

//	在继承WebMvcConfigurationSupport的类里重写以下方法完成添加适配器
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        log.info("配置转换器....");
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();

        messageConverter.setObjectMapper(new JacksonObjectMapper());

        converters.add(0, messageConverter);
    }
相关推荐
哎呦没27 分钟前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
编程、小哥哥1 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
IT学长编程2 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇2 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
杨哥带你写代码2 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
郭二哈3 小时前
C++——模板进阶、继承
java·服务器·c++
A尘埃3 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23073 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
沉登c3 小时前
幂等性接口实现
java·rpc
代码之光_19803 小时前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端