MybatisPlus实现联表分页查询
MybatisPlus实现联表分页查询
在开发中遇到了一个问题,需要进行联表查询并进行分页,因为不想自己来写分页,所以还是依靠MybatisPlus来实现想要的功能。
首先我们有一个需求,是想根据产品表sys_product中的factory_id来获取工厂表sys_factory中的工厂信息,而且要实现分页查询。
-
产品表 sys_product
-
工厂表sys_facotry
-
在ProductMapper中我们自定义一个page方法,通过@Select注解来执行联表查询的sql,接受两个参数,一个Page分页参数,一个QueryWrapper查询参数。
@Repository public interface ProductMapper extends BaseMapper<Product> { String wrapperSql = "select p.id,p.product_name,p.product_img_url,p.factory_id,f.factory_name from sys_product p left join sys_factory f on p.factory_id = f.id ${ew.customSqlSegment}"; @Select(wrapperSql) Page<Product> page(Page page, @Param("ew") Wrapper queryWrapper); }
-
在ProductService接口中定义一个查询的方法,接受查询相关的参数,如当前页,页容量,模糊查询相关的数据等。
public interface ProductService extends IService<Product> { Page<Product> getProductList(ProductPageVo productPageVo); }
-
在ProductServiceImpl中调用ProductMapper中我们写的page方法,传入Page和QueryWrapper参数
@Service public class ProductServiceImpl extends ServiceImpl<ProductMapper,Product> implements ProductService { public Page<Product> getProductList(ProductPageVo productPageVo){ String productName = productPageVo.getProductName(); QueryWrapper<Product> productQueryWrapper = new QueryWrapper<>(); if (Strings.isNotBlank(productPageVo.getProductName())){ productQueryWrapper.lambda().like(Product::getProductName,productName); } Page<Product> page = new Page<>(); page.setCurrent(productPageVo.getCurrentPage()); page.setSize(productPageVo.getPageSize()); Page<Product> res = this.baseMapper.page(page, productQueryWrapper); return res; } }
-
ProductPageVo类
@Data @NoArgsConstructor @AllArgsConstructor public class ProductPageVo { // 当前页 private int currentPage; // 页容量 private int pageSize; // 模糊查询 private String productName; }
-
ProductController
@ResponseBody @RequestMapping("/getProductList") public ResultVo getProductList(@RequestBody ProductPageVo productPageVo){ Page<Product> productList = productService.getProductList(productPageVo); return ResultUtils.success("查询成功",productList); }
这样,我们就实现了MybatisPlus的联表分页查询。