基于MybatisPlus的简单分页查询和条件分页查询
  vMFfBrgGhofu 2023年11月01日 55 0

分页查询

分析:

  • 分析文档要求

  • 查看前端传递给后台的参数

  • 分析参数进行编码

  • 后台返回给前端的数据

思路

浏览器 - > Controller层 - > Service层 - > Mapper层 - > 数据库

设置分页拦截器

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        // 创建MybatisPlusInterceptor拦截器对象
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        // 添加分页拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mpInterceptor;
    }
}

IPage分页对象的常用调用方法

​ IPage内部原理是基于拦截去,拦截的是方法以及方法中的参数,会判断是否查询操作。如果是查询操作,才会进入分页的逻辑处理。进入分页的逻辑处理后,拦截器会通过反射获取该方法的参数进行判断是否存在IPage对象的实体类。如果不存在就不进行分页,存在则将该参数赋值给IPage对象。再进行拼接sql处理完成IPage对象。

void selectPage() {
    // 1 为当前页码  2 为每页的记录数
	IPage<User> page=new Page<>(1,3);
	userDao.selectPage(page,null);
	System.out.println("当前页码值:"+page.getCurrent());
	System.out.println("每页显示数:"+page.getSize());
	System.out.println("一共多少页:"+page.getPages());
	System.out.println("一共多少条数据:"+page.getTotal());
	System.out.println("数据:"+page.getRecords());
}

流程

Controller层

@RestController
@RequestMapping("/emps")
public class EmpController {
    
    @Autowired
    private EmpService empService;

// @RequestParam使用defaultValue属性设置默认值
// @GetMapping请求映射的地址
@GetMapping
    public Result selectLimit(@RequestParam(defaultValue = "1") Integer page,
                             @RequestParam(defaultValue = "10") Integer pageSize) {
        // 调用业务层进行查询
        PageBean pageBean = empService.selectLimit(page, pageSize); 
        // 返回打包封装后的数据
        return Result.success(pageBean);
    }
}

Service层

@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService {

    @Autowired
    private EmpMapper empMapper;

    @Override
    public PageBean selectLimit(Integer page, Integer pageSize) {
        // 定义Emp实体对象封装操作类
        QueryWrapper<Emp> queryWrapper = new QueryWrapper<>();
        // 进行分页查询
        IPage<Emp> iPage = new Page<>(page, pageSize);
        iPage = empMapper.selectPage(iPage, queryWrapper);

        //封装返回值 返回
        return new PageBean(iPage.getTotal(), iPage.getRecords());
    }
}

Mapper层

@Mapper
public interface EmpMapper extends BaseMapper<Emp> {

}

条件分页查询

Controller 层

  1. 接受参数(分页参数, 查询条件)
  2. 调用service进行条件分页查询, 获取pagebean
  3. 响应
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {

    @Autowired
    private EmpService empService;

    // 此处为了方便测试,不整合
    @GetMapping
    public Result selectLimit(@RequestParam(defaultValue = "1") Integer page,
                              @RequestParam(defaultValue = "10") Integer pageSize,
                              String name, Short gender,
                              @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                              @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
//        log.info("数据:{},{},{},{},{},{}", page, pageSize, name, gender, begin, end);
        PageBean pageBean = empService.selectLimit(page, pageSize, name, gender, begin, end);
        return Result.success(pageBean);
    }

}

Service 层

LambdaQueryWrapperQueryWrapper 都是 Mybatis Plus 中的查询条件封装类,这里使用的是LambdaQueryWrapper,它和QueryWrapper的区别是列名匹配的是Lambda的语法,偏向于对象,而QueryWrapper列名匹配使用使用的是“数据库中的字段名”

优点: 更加简便的查询语法,避免了SQL注入的风险,避免运行时出现类型错误,编译时能捕获到类型错误

@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService {

    @Autowired
    private EmpMapper empMapper;

    @Override
    public PageBean selectLimit(Integer page, Integer pageSize,
                                String name, Short gender,
                                LocalDate begin, LocalDate end) {
        // 创建LamdbaQueryWrapper对象
        LambdaQueryWrapper<Emp> queryWrapper = new LambdaQueryWrapper<>(Emp.class);
        
        // 判断是否为空条件,LambdaQueryWrapper提供的方法添加条件
        if(name != null && name != "") {
            queryWrapper.like(Emp::getName, name);
        }

        if(gender != null) {
            queryWrapper.eq(Emp::getGender, gender);
        }

        if(begin != null)
            queryWrapper.eq(Emp::getEntrydate, begin);

        if(end != null)
            queryWrapper.eq(Emp::getCreateTime, end);
		
        // 定义分页对象
        IPage<Emp> iPage = new Page<>(page, pageSize);
        // 根据分页对象执行数据库查询
        iPage = empMapper.selectPage(iPage, queryWrapper);
        //封装返回值 返回
        return new PageBean(iPage.getTotal(), iPage.getRecords());
    }
}

借阅:MyBatis-Plus分页插件IPage的使用展示------分页查询_mybatisplus ipage_星域_03zhan的博客-CSDN博客

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   55   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   110   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
vMFfBrgGhofu