【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);
    }
相关推荐
七星静香20 分钟前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员21 分钟前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU21 分钟前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie625 分钟前
在IDEA中使用Git
java·git
Elaine20239140 分钟前
06 网络编程基础
java·网络
G丶AEOM41 分钟前
分布式——BASE理论
java·分布式·八股
落落鱼201342 分钟前
tp接口 入口文件 500 错误原因
java·开发语言
想要打 Acm 的小周同学呀43 分钟前
LRU缓存算法
java·算法·缓存
镰刀出海1 小时前
Recyclerview缓存原理
java·开发语言·缓存·recyclerview·android面试
阿伟*rui3 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel