四. 品牌分类
1. 实现分页
1. 问题
-
查询出来的数据条数显示只有0条, 且没有实现分页功能
2. 解决
1. 官网
2. config配置类
-
创建配置类
@Configuration // 开启事务 @EnableTransactionManagement @MapperScan("com.hjf.gulimall.product.dao") public class MyBatisConfig { // 1. 引入分页插件 @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false paginationInterceptor.setOverflow(true); // 设置最大单页限制数量,默认 500 条,-1 不受限制 paginationInterceptor.setLimit(500); // 开启 count 的 join 优化,只针对部分 left join paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); return paginationInterceptor; } }
-
效果
2. 查询功能
1. 问题
-
品牌模糊查询方法查询时没有传入任何参数, 所以需要重写此方法
2. 解决
-
service层代码
@Override public PageUtils queryPage(Map<String, Object> params) { // 1. 获取key String key = (String) params.get("key"); QueryWrapper<BrandEntity> wrapper = new QueryWrapper<>(); if (!StringUtils.isEmpty(key)) { // 如果id相同或者name相似, 则返回 wrapper.eq("brand_id", key).or().like("name", key); } IPage<BrandEntity> page = this.page( new Query<BrandEntity>().getPage(params), wrapper ); return new PageUtils(page); }
-
效果
3. 关联分类
0. 前提
1. 文件替换
-
将项目中的common和product中的文件替换成课件中的文件
-
效果
2. 功能说明
- 每个品牌都是自己所属的分类, 同一个品牌可能属于多个分类, 一个分类有多个分类
1. 获取品牌分类列表
1. Controller层
-
接口
/product/categorybrandrelation/catelog/list
-
代码
/** * 获取当前品牌关联的所有分类关系 * @param brandId * @return */ @GetMapping("/catelog/list") public R catelogList(@RequestParam("brandId") Long brandId){ List<CategoryBrandRelationEntity> data = categoryBrandRelationService.list( new QueryWrapper<CategoryBrandRelationEntity>().eq("brand_id", brandId)); return R.ok().put("data", data); }
2. 添加关联关系
1. 问题
- 默认生成的添加方法需要传入品牌名和分类名, 如果每次都是通过品牌id和分类id去数据库中读取对应的值, 会极大的影响数据库的性能, 所有我们需要在添加关联关系时, 将品牌名和分类名一同添加到中间表中
2. 代码
-
Controller层
/** * 保存 */ @RequestMapping("/save") public R save(@RequestBody CategoryBrandRelationEntity categoryBrandRelation){ // categoryBrandRelationService.save(categoryBrandRelation); categoryBrandRelationService.saveDetail(categoryBrandRelation); return R.ok(); }
-
Service接口
void saveDetail(CategoryBrandRelationEntity categoryBrandRelation);
-
Service实现
@Autowired BrandDao brandDao; @Autowired CategoryDao categoryDao; @Override public void saveDetail(CategoryBrandRelationEntity categoryBrandRelation) { Long brandId = categoryBrandRelation.getBrandId(); Long catelogId = categoryBrandRelation.getCatelogId(); // 1. 根据品类id和分类id获取名字 BrandEntity brandEntity = brandDao.selectById(brandId); CategoryEntity categoryEntity = categoryDao.selectById(catelogId); // 2. 关联关系实体类中设置品类名和分类名 categoryBrandRelation.setBrandName(brandEntity.getName()); categoryBrandRelation.setCatelogName(categoryEntity.getName()); this.save(categoryBrandRelation); }
3. 效果
-
测试
-
响应数据
-
数据库
5. 优化
添加品牌分类时, 并没有做联表, 而是直接在中间表中冗余存储了品牌名和分类名,
如果品牌名和分类名发生修改时, 并不会同步过来.
所以在修改品牌和分类时, 不能只修改品牌表和分类表, 还需要修改中间的关联表
1. 品牌修改
-
controller层
@RequestMapping("/update") // @RequiresPermissions("product:brand:update") public R update(@Validated({UpdateGroup.class}) @RequestBody BrandEntity brand){ // brandService.updateById(brand); brandService.updateDetail(brand); return R.ok(); }
-
BrandService接口
void updateDetail(BrandEntity brand);
-
BrandServiceImpl实现
@Autowired private CategoryBrandRelationService categoryBrandRelationService; @Override public void updateDetail(BrandEntity brand) { // 保证冗余字段的数据一致 // 通过品牌id修改品牌表 this.updateById(brand); if (!StringUtils.isEmpty(brand.getName())) { // 同步更新其他关联表中的数据 categoryBrandRelationService.updateBrand(brand.getBrandId(), brand.getName()); // TODO: 更新其他关联 } }
-
CategoryBrandRelationService接口
/** * 修改关联数据 * @param brandId * @param name */ void updateBrand(Long brandId, String name);
-
CategoryBrandRelationServiceImpl实现
/** * 修改关联数据 * @param brandId * @param name */ @Override public void updateBrand(Long brandId, String name) { CategoryBrandRelationEntity relationEntity = new CategoryBrandRelationEntity(); relationEntity.setBrandId(brandId); relationEntity.setBrandName(name); this.update(relationEntity, new UpdateWrapper<CategoryBrandRelationEntity>() .eq("brand_id", brandId)); }
2. 测试
-
修改品牌名
-
关联表中的数据会同步修改
2. 分类修改
-
CategoryController
/** * 修改 */ @PostMapping("/update") public R update(@RequestBody CategoryEntity category){ // categoryService.updateById(category); categoryService.updateCascade(category); return R.ok(); }
-
CategoryService
/** * 级联更新所有关联的数据 * @param category */ void updateCascade(CategoryEntity category);
-
CategoryServiceImpl
@Autowired CategoryBrandRelationService categoryBrandRelationService; /** * 级联更新所有关联的数据 * @param category */ @Override public void updateCascade(CategoryEntity category) { this.updateById(category); categoryBrandRelationService.updateCategory(category.getCatId(), category.getName()); }
-
CategoryBrandRelationService
void updateCategory(Long catId, String name);
-
CategoryBrandRelationServiceImpl
@Override public void updateCategory(Long catId, String name) { this.baseMapper.updateCategory(catId, name); }
-
CategoryBrandRelationDao
@Mapper public interface CategoryBrandRelationDao extends BaseMapper<CategoryBrandRelationEntity> { void updateCategory(@Param("cateId") Long catId, @Param("name") String name); }
-
CategoryBrandRelationDao.xml
<update id="updateCategory"> update `pms_category_brand_relation` set catelog_name = #{name} where catelog_id = #{cateId} </update>
2. 演示
-
修改分类名称
-
关联表中的数据会同步更改