瑞吉day3
搞定了分页以及数据传输的问题
mybatis-plus分页接口实现
分页主要是通过mybatis提供的接口实现的。这篇笔记只是记录如何实现这个接口,并不会深究原理。
博主也比较菜,目前还没有手撕mybatis代码,后续有机会研究一下(又挖了个坑,哈哈)
实现过程:
- 编写一个mybatis配置类
- 编写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类型。
当然也是直接抄别人就行。
依旧暂不深究原理,只研究怎么实现。
实现过程:
- 编写JackonMap类,定义一下转换规则
- 去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);
}