谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO

文章目录

  • 七、商品服务-品牌管理
    • 6.品牌分类关联与级联更新
        • (1).MyBatis-Plus分页插件
        • (2).模糊查询
        • (3).关联分类
  • 八、商品服务-属性分组、平台属性
    • 1.属性分组-获取分类属性分组
    • 2.平台属性-规格参数新增与vo
    • 3.平台属性-规格参数列表
    • 4.平台属性-规格修改
    • 5.平台属性-销售属性
    • 6.平台属性-查询分组关联属性

七、商品服务-品牌管理

6.品牌分类关联与级联更新

(1).MyBatis-Plus分页插件

官网:分页插件 | MyBatis-Plus

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第1张图片

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第2张图片

(2).模糊查询

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第3张图片

(3).关联分类

/**
     * 保存
     */
    @RequestMapping("/save")
    //@RequiresPermissions("product:categorybrandrelation:save")
    public R save(@RequestBody CategoryBrandRelationEntity categoryBrandRelation){
		categoryBrandRelationService.saveDetail(categoryBrandRelation);

        return R.ok();
    }
/**
     * 
     * @param categoryBrandRelation
     */
    @Override
    public void saveDetail(CategoryBrandRelationEntity categoryBrandRelation) {
        Long brandId = categoryBrandRelation.getBrandId();
        Long catelogId = categoryBrandRelation.getCatelogId();
        //查询详细名字
        BrandEntity brandEntity = brandDao.selectById(brandId);
        CategoryEntity categoryEntity = categoryDao.selectById(catelogId);

        categoryBrandRelation.setBrandName(brandEntity.getName());
        categoryBrandRelation.setCatelogName(categoryEntity.getName());

        this.save(categoryBrandRelation);
    }

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第4张图片

当我们在品牌或者分类中修改了名字,在品牌分类联合表中也需要修改

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第5张图片

同步更新冗余字段

=============BrandServiceImpl.java=============
    @Override
    public void updateDetail(BrandEntity brand) {
        //保证冗余字段的数据一致
        this.updateById(brand);
        //如果要更改品牌名 其他表也需要修改
        if (!StringUtils.isEmpty(brand.getName())){
            categoryBrandRelationService.updateBrand(brand.getBrandId(),brand.getName());
        }
        //TODO 更新其他关联
    }
=============CategoryServiceImpl.java============
    @Override
    public void updateDetail(CategoryEntity category) {
        this.updateById(category);
        if (!StringUtils.isEmpty(category.getName())){
            categoryBrandRelationService.updateCategory(category.getCatId(),category.getName());
        }
        //TODO 修改其他关联
    }
=============CategoryBrandRelationServiceImpl.java============
	@Override
    public void updateBrand(Long brandId, String name) {
        this.update(
                new UpdateWrapper<CategoryBrandRelationEntity>().eq("brand_id",brandId).set("brand_name",name);
        );
    }

    @Override
    public void updateCategory(Long catId, String name) {
        this.update(
                new UpdateWrapper<CategoryBrandRelationEntity>().eq("catelog_id",catId).set("catlog_name",name);
        );
    }

八、商品服务-属性分组、平台属性

1.属性分组-获取分类属性分组

属性表

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第6张图片

属性分组表

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第7张图片

中间表

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第8张图片

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第9张图片

代码实现

================AttrGroupController.java===============
/**
 * 列表
 */
@RequestMapping("/list/{catelogId}")
//@RequiresPermissions("product:attrgroup:list")
public R list(@RequestParam Map<String, Object> params,
                  @PathVariable("catelogId") Long catelogId){
    PageUtils page = attrGroupService.queryPage(params,catelogId);

    return R.ok().put("page", page);
}
===============AttrGroupServiceImpl.java===================
@Override
public PageUtils queryPage(Map<String, Object> params, Long catelogId) {
    if (catelogId == 0){
        //默认查询条件为空 查所有
        IPage<AttrGroupEntity> page = this.page(new Query<AttrGroupEntity>().getPage(params),
                                                new QueryWrapper<AttrGroupEntity>());
        return new PageUtils(page);
    }else {
        String key = (String) params.get("key");
        //模糊查询多字段
        //查询指定id select * from pms_attr_group where catelog_id=? and (attr_group_id=key or attr_group_name like key)

        //构造查询条件
        //填写要查询的表对应的实体类
        QueryWrapper<AttrGroupEntity> wrapper = new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId);
        if (!StringUtils.isEmpty(key)) {
            wrapper.and((obj) -> {
                obj.eq("attr_group_id", key).or().like("attr_group_name", key);
            });
        }

        IPage<AttrGroupEntity> page = this.page(new Query<AttrGroupEntity>().getPage(params),
                                                wrapper);
        return new PageUtils(page);
    }
}

用pageUtils封装返回

postman测试返回page封装数据

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第10张图片

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第11张图片

2.平台属性-规格参数新增与vo

Object划分:

  • PO(Persistant Object)持久对象 po就是对应数据库中某个表中的一条记录 比如Entiy中的每个实体类都对应一个表中的数据
  • DO(Domain Object)领域对象 do就是从现实世界中抽象出来的有形或无形的业务实体
  • TO(Transfer Object)数据传输对象 不同应用程序之间传输的对象 被封装传输的对象,如分页查询中的page返回
  • DTO(Data Transfer Object)数据传输对象
  • VO(Value Object / View Object 视图对象)值对象 为了将PO对象数据返回,我们在PO数据上加了很多的注解,使用JSON取消掉了很多不需要返回的数据,但这种方式是很不正规的方法。应该新建一个vo对象包含我们要返回的数据或者接收页面返回的数据。
  • BO(Business Object)业务对象 建立一个对应简历的BO对象处理简历中的教育、工作、社会经历等PO,每个BO包含这些PO。这样处理业务逻辑时,我们就可以针对BO处理
  • POJO(Plan Ordinary Java Object)简单无规则java对象 传统意义的java对象 POJO是DO/DTO/BO/VO的统称
  • DAO(Data Access Object)数据访问对象 访问数据库的对象

新建AttrVo.java

package com.henu.soft.merist.gulimall.product.vo;

import lombok.Data;

@Data
public class AttrVo {
    /**
     * 属性id
     */
    private Long attrId;
    /**
     * 属性名
     */
    private String attrName;
    /**
     * 是否需要检索[0-不需要,1-需要]
     */
    private Integer searchType;
    /**
     * 属性图标
     */
    private String icon;
    /**
     * 可选值列表[用逗号分隔]
     */
    private String valueSelect;
    /**
     * 属性类型[0-销售属性,1-基本属性,2-既是销售属性又是基本属性]
     */
    private Integer attrType;
    /**
     * 启用状态[0 - 禁用,1 - 启用]
     */
    private Long enable;
    /**
     * 所属分类
     */
    private Long catelogId;
    /**
     * 快速展示【是否展示在介绍上;0-否 1-是】,在sku中仍然可以调整
     */
    private Integer showDesc;

    private Long attrGroupId;
}

AttrServiceImpl.java

@Service("attrService")
public class AttrServiceImpl extends ServiceImpl<AttrDao, AttrEntity> implements AttrService {

    @Autowired
    AttrAttrgroupRelationDao attrAttrgroupRelationDao;

    @Transactional
    @Override
    public void saveAttr(AttrVo attr) {
        AttrEntity attrEntity = new AttrEntity();
        BeanUtils.copyProperties(attr,attrEntity);
        //保存基础数据
        this.save(attrEntity);

        //保存关联关系
        AttrAttrgroupRelationEntity attrAttrgroupRelationEntity = new AttrAttrgroupRelationEntity();
        attrAttrgroupRelationEntity.setAttrGroupId(attr.getAttrGroupId());
        attrAttrgroupRelationEntity.setAttrId(attrEntity.getAttrId());

        attrAttrgroupRelationDao.insert(attrAttrgroupRelationEntity);
    }

}

3.平台属性-规格参数列表

前端请求参数列表

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第12张图片

后端数据库列表谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第13张图片

为了返回所属分类、所属分组 名字 新建一个vo来返回

package com.henu.soft.merist.gulimall.product.vo;

import lombok.Data;

@Data
public class AttrRespVo extends AttrVo{

    private String catelogName;

    private String groupName;
}

在大数据的情况下,连表查询消耗大,所以我们分开查,先查出 attr 的所有属性,利用BeanuUils的工具方法将 attr 的数据放到 AttrRespVo 对象中,再查询分类名、分组名。

=============================AttrServiceImpl.java=============================
@Override
    public PageUtils queryBaseAttrPage(Map<String, Object> params, Long catelogId) {
        QueryWrapper<AttrEntity> queryWrapper= new QueryWrapper<>();
        if (catelogId != 0){
            queryWrapper.eq("catelog_id",catelogId);
        }
        //获取检索条件
        //attr_id = key  or  attr_name like key
        String key = (String) params.get("key");
        if (!StringUtils.isEmpty(key)){
            queryWrapper.and((wrapper)->{
                wrapper.eq("attr_id",key).or().like("attr_name",key);
            });
        }

        IPage<AttrEntity> page = this.page(
                new Query<AttrEntity>().getPage(params),
                queryWrapper
        );
        PageUtils pageUtils = new PageUtils(page);
        List<AttrEntity> records = page.getRecords();

        List<Object> respVos = records.stream().map((attrEntity) -> {
            AttrRespVo attrRespVo = new AttrRespVo();
            BeanUtils.copyProperties(attrEntity,attrRespVo);

            //设置分组、分类的名字
            AttrAttrgroupRelationEntity attr_id = attrAttrgroupRelationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrEntity.getAttrId()));
            if (attr_id != null) {
                attrRespVo.setGroupName(attrGroupDao.selectById(attr_id).getAttrGroupName());
            }

            CategoryEntity categoryEntity = categoryDao.selectById(attrEntity.getCatelogId());
            if (categoryEntity != null) {
                attrRespVo.setCatelogName(categoryEntity.getName());
            }
            return attrRespVo;
        }).collect(Collectors.toList());

        pageUtils.setList(respVos);
        return pageUtils;
    }

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第14张图片

4.平台属性-规格修改

修改设置回显分类

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第15张图片

=============================AttrServiceImpl.java================================
@Override
    public AttrRespVo getAttrInfo(Long attrId) {
        AttrRespVo respVo = new AttrRespVo();
        AttrEntity attrEntity = this.getById(attrId);
        BeanUtils.copyProperties(attrEntity,respVo);

        //设置分组信息
        AttrAttrgroupRelationEntity attr_id = attrAttrgroupRelationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrId));
        if (attr_id != null) {
            respVo.setAttrGroupId(attr_id.getAttrGroupId());
            AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attr_id);
            if (attrGroupEntity != null){
                respVo.setGroupName(attrGroupEntity.getAttrGroupName());
            }
        }

        //设置分类信息
        Long catelogId = attrEntity.getCatelogId();
        Long[] catelogPath = categoryService.findCatelogPath(catelogId);
        respVo.setCatelogPath(catelogPath);

        CategoryEntity categoryEntity = categoryService.getById(catelogId);
        if (categoryEntity != null){
            respVo.setCatelogName(categoryEntity.getName());
        }

        return respVo;
    }

规格修改

=============================AttrServiceImpl.java================================
@Transactional
    @Override
    public void updateAttr(AttrVo attrVo) {
        //修改基本数据
        AttrEntity attrEntity = new AttrEntity();
        BeanUtils.copyProperties(attrVo,attrEntity);
        this.updateById(attrEntity);

        //修改关联分组
        AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();

        relationEntity.setAttrGroupId(attrVo.getAttrGroupId());
        relationEntity.setAttrId(attrVo.getAttrId());

        Long count = attrAttrgroupRelationDao.selectCount(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrVo.getAttrId()));

        if (count > 0){
            attrAttrgroupRelationDao.update(relationEntity,new UpdateWrapper<AttrAttrgroupRelationEntity>().eq("attr_id",attrVo.getAttrId()));
        }else {
            attrAttrgroupRelationDao.insert(relationEntity);
        }
    }

5.平台属性-销售属性

参数规格 和 销售属性 都放在属性表中

谷粒商城6—— MyBatis-Plus分页插件 模糊查询 大数据多表查询高效查询 平台属性业务代码的实现 Object划分:PO\DO\TO\DTO\VO\BO\POJO\DAO_第16张图片

封装成一个枚举,在增删改查方法上加上相应的判断即可,销售属性 不用加分组关系也就是不用关联表

6.平台属性-查询分组关联属性

======================AttrServiceImpl.java===================
    @Override
    public void deleteRelation(AttrGroupRelationVo[] vos) {
//        relationDao.delete(new QueryWrapper<>().eq("attr_id",1L).eq("attr_group_id",1L));
        List<AttrAttrgroupRelationEntity> entities = Arrays.asList(vos).stream().map((item) -> {
            AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
            BeanUtils.copyProperties(item, relationEntity);
            return relationEntity;
        }).collect(Collectors.toList());
        //批量删除
        relationDao.deleteBatchRelations(entities);
    }
=====================AttrAttrGroupRelationDao.xml========================

DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.henu.soft.merist.gulimall.product.dao.AttrAttrgroupRelationDao">

    
    <resultMap type="com.henu.soft.merist.gulimall.product.entity.AttrAttrgroupRelationEntity" id="attrAttrgroupRelationMap">
        <result property="id" column="id"/>
        <result property="attrId" column="attr_id"/>
        <result property="attrGroupId" column="attr_group_id"/>
        <result property="attrSort" column="attr_sort"/>
    resultMap>
    <delete id="deleteBatchRelations">
        DELETE from `pms_attr_attrgroup_relation` where
        
        <foreach collection="entities" item="item" separator=" OR ">
            (attr_id=#{item.attrId} AND attr_group_id=#{item.attrGroupId})
        foreach>
    delete>

mapper>

你可能感兴趣的:(谷粒商城,mybatis,java,springboot)