当前位置: 首页 > article >正文

Mybatis-Plus分页和根据日期查询数据

我目前使用的mybatis-plus是3.2.0版本,目前最新的版本是3.4.2。由于项目写了很多,不方便改成最新版。

最新版和本版本也有不少差距,但是均可忽略。

就本版本而言,主要讨论两个问题,一个是分页,一个是根据日期查询。

1.分页

首先按照官方文档,编写一个配置类:

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
 * @ClassName:
 * @author: flitsneak nonagon
 * @date: 2021/3/12
 */
@Configuration
public class MybatisPlusConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor(){
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        return paginationInterceptor;
    }
}

接下来编写vo用来接收前端传来的参数,分别为起始页码和当前页还有分页条件,这里的分页条件为petId是个String。

@Data
public class PetPageVO implements Serializable {
    private String petId;
    private Integer currPage;
    private Integer pageSize;
}

然后controller:

/**
 * 分页查询宠物病例历史列表
 * @param petPageVO
 * @return
 */
@PostMapping("/listPetExamByPetId")
public R listPetExamByPetId(@RequestBody PetPageVO petPageVO){
    String pageNo = petPageVO.getCurrPage().toString();
    String pageSize = petPageVO.getPageSize().toString();
    String petId = petPageVO.getPetId();
    Map map = new HashMap();
    map.put("page",pageNo);
    map.put("limit",pageSize);
    map.put("petId",petId);
    PageUtils pageUtils = petExamService.queryPage(map);
    return new R(true,StatusCode.PETEXAMLISTSUCCESS.getCode(),StatusCode.PETEXAMLISTSUCCESS.getMsg(),pageUtils);
}

这里要注意不要用Integer,会提示转换失败报错,我们可以看mybatis-plus底层是怎么做的:

public class Query<T> {

    public IPage<T> getPage(Map<String, Object> params) {
        return this.getPage(params, null, false);
    }

    public IPage<T> getPage(Map<String, Object> params, String defaultOrderField, boolean isAsc) {
        //分页参数
        long curPage = 1;
        long limit = 10;

        if(params.get(Constant.PAGE) != null){
            curPage = Long.parseLong((String)params.get(Constant.PAGE));
        }
        if(params.get(Constant.LIMIT) != null){
            limit = Long.parseLong((String)params.get(Constant.LIMIT));
        }

        //分页对象
        Page<T> page = new Page<>(curPage, limit);

        //分页参数
        params.put(Constant.PAGE, page);

        //排序字段
        //防止SQL注入(因为sidx、order是通过拼接SQL实现排序的,会有SQL注入风险)
        String orderField = SQLFilter.sqlInject((String)params.get(Constant.ORDER_FIELD));
        String order = (String)params.get(Constant.ORDER);


        //前端字段排序
        if(StringUtils.isNotEmpty(orderField) && StringUtils.isNotEmpty(order)){
            if(Constant.ASC.equalsIgnoreCase(order)) {
                return  page.addOrder(OrderItem.asc(orderField));
            }else {
                return page.addOrder(OrderItem.desc(orderField));
            }
        }

        //没有排序字段,则不排序
        if(StringUtils.isBlank(defaultOrderField)){
            return page;
        }

        //默认排序
        if(isAsc) {
            page.addOrder(OrderItem.asc(defaultOrderField));
        }else {
            page.addOrder(OrderItem.desc(defaultOrderField));
        }

        return page;
    }
}


可以看到这里的params.get(Constant.PAGE)如果不为空则读取参数curPage = Long.parseLong((String)params.get(Constant.PAGE)),这里有个转换,先转换为整形再转换为string。Constant.PAGE 其实就是page。

然后我们分页即可:

@Service("PetExamService")
public class PetExamServiceImpl extends ServiceImpl<PetExamDao, PetExamEntity> implements PetExamService {
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        LambdaQueryWrapper<PetExamEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(PetExamEntity::getPetId,params.get("petId"))
                .select();
        IPage<PetExamEntity> page = this.page(
                new Query<PetExamEntity>().getPage(params),
                lambdaQueryWrapper
        );

        return new PageUtils(page);
    }
}


2.根据日期查询

日期的处理一向比较严肃,mybatis-plus没有提供函数处理,所以要使用apply进行编写对应函数。

本案例是接收前端传入的日期数组并查询数据。

controller层:

/**
 * 根据日期范围查看宠物历史记录
 * @param dateArrays
 * @return
 */
@PostMapping("/listPetHistoryExamByDateArray/{petId}")
public R listPetHistoryExamByDateArray(@PathVariable String petId,@RequestBody String[] dateArrays){
    LambdaQueryWrapper<PetExamEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.eq(PetExamEntity::getPetId,petId);
    for (int i = 0; i < dateArrays.length; i++) {
            lambdaQueryWrapper.apply("TO_DAYS(create_time) = TO_DAYS('"+dateArrays[i]+"')")
                    .or();
    }
    lambdaQueryWrapper.select();
    List<PetExamEntity> list = petExamService.list(lambdaQueryWrapper);

    return new R(true,StatusCode.PETEXAMLISTBYHISTORYARRAYSUCCESS.getCode(),StatusCode.PETEXAMLISTBYHISTORYARRAYSUCCESS.getMsg(),list);
}

注意这里的apply里面传递的实际是sql,不要忘记加or否则是and连接。


http://www.kler.cn/news/342159.html

相关文章:

  • HTML5+Css3(背景属性background)
  • 力扣1930. 长度为3的不同回文子序列
  • App推广新利器:Xinstall带你直达指定页面
  • PVC刻字膜高精度模切应用
  • 超像素提取加svm训练,鼠标点击选择标签(左键为正样本,右键为负样本)
  • 新个性化时尚解决方案!Prompt2Fashion:自动生成多风格、类型时尚图像数据集。
  • 垃圾回收(GC)是什么?深入理解Java(以主要版本为主线)的垃圾回收机制/策略,垃圾回收器的选择、实际案例分析
  • IDM6.42下载器最新版本,提速你的网络生活!
  • Vue3 中的 `replace` 属性:优化路由导航的利器
  • electron-vite_1搭建项目
  • 机器学习、深度学习评价指标汇总:TP、TN、FP、FN、AP、mAP、IoU、mAP@3、Prec@10、 Acc@10
  • SpringBoot框架在旅游管理中的应用与实践
  • gpg 密钥生成、导入、导出、自动输入密码
  • 五、创建型(建造者模式)
  • 开源模型应用落地-模型微调-模型研制-模型测试(三)
  • 输电线路缺陷图像检测数据集,导线散股,塔材锈蚀两类,分别为581张和1407张,标注为xml和txt格式 1988张
  • 超越单线程:Web Worker 在前端性能中的角色
  • Auto-Animate:是一款零配置、即插即用的动画工具,可以为您的 Web 应用添加流畅的过渡效果
  • 从零开始做电力监测终端
  • 汽车宣传动画渲染怎么做?云渲染加速汽车动画渲染