【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);
    }
相关推荐
y25084 分钟前
《Object类》
java·开发语言
曙曙学编程5 分钟前
初级数据结构——树
android·java·数据结构
BestandW1shEs11 分钟前
彻底理解消息队列的作用及如何选择
java·kafka·rabbitmq·rocketmq
爱吃烤鸡翅的酸菜鱼13 分钟前
Java算法OJ(8)随机选择算法
java·数据结构·算法·排序算法
码蜂窝编程官方16 分钟前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
Viktor_Ye33 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm35 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
一二小选手39 分钟前
【Maven】IDEA创建Maven项目 Maven配置
java·maven
J老熊1 小时前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程
猿java1 小时前
什么是 Hystrix?它的工作原理是什么?
java·微服务·面试