基于MybatiesPlus下自定义分页模糊查询

486 阅读2分钟

这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

这是一个springboot项目,准备工作,我们就不多说,主要就是相关jar的依赖导入,和MybatiesPlus相关的配置之类,我们直接切入主题。

这个功能的主要需求就是对于搜索有两个字段,一个是status 我可以选择输入,进行搜索,也可以不输入,默认为0,抛弃这个字段搜索,另一个字段 matchName 可以进行模糊搜索,也可以不输入搜索全部,整体的搜索都有分页的功能

使用的自定义的SQL,

最先写一下我们的mapper类

IPage<Match> findMatchPage(IPage<Match> page, Map<String,Object> map);

再写出我们相关的SQL语句,其中我们要注意的就是IPage 定义的方法,我们不管是使用QueryWrapper 还是 Map 我们的运行的时候都会报找不到字段的错误,

所以,我们在写SQL的时候我们需要map.matchName 的方式,指出我们的字段

    <select id="findMatchPage" resultType="com.example.oj.entity.dao.Match" >
        select * from matches where  name  like '%${map.matchName}%'
        <if test="map.status!=null">
            and is_delete = #{map.status}
        </if>
    </select>

写完上述部分,我们就可以使用测试,对我们的代码进行测试

之后就是service实现

    public IPage<Match> findMatchPage(int i,String matchName,int page,int pageSize) {
        //定义我们的分页对象
        Page<Match> page1 = new Page<>(page, pageSize);
        //根据自己的实体设置相关的map的Key
        Map<String,Object> map = new HashMap<>();
        if(i!=0) {
            map.put("status",i);
        }
        map.put("matchName",matchName);

        IPage<Match> matchPage = matchMapper.findMatchPage(page1, map);
        return matchPage;
    }

我们使用Map的方式传入参数就可以根据我们参数值判断是否进入到我们的SQL操作中,从而实现我们的动态SQL,如果我们的map.put("status",i); 没有添加,那我们SQL的执行就是

select * from matches where name like '%${map.matchName}%'

因为我们使用的是模糊查询如果我们的matchName 也是null的话,就会查询全部

最后就是我们的controller层

    public void findMatch(@RequestParam(value = "status",defaultValue = "0") int i,
                          @RequestParam(value = "matchName",required = false) String matchName,
                          @RequestParam(value = "page",defaultValue = "1") int page,
                          @RequestParam(value = "pageSize",defaultValue = "10") int pageSize){

        IPage<Match> match = matchService.findMatchPage(i, matchName, page, pageSize);
        if(match != null&&match.getRecords().size() > 0){
            Map<String,Object> map = new HashMap<>();
            map.put("match",match.getRecords());
            map.put("total",match.getTotal());
            return ;
        }
        return ;
      }

我们下面的方法都是IPage 类型,这是一个分页的类型,我们如果直接打印一下大家就会发现了,所以我们需要调用一下getRecords() 方法,通过我们的IPage对象还可以查询到我们的总页数,一起其他的数据,大家可以根据自己的需求进行使用.