谷粒商城-全栈-32 商品服务-各层命名规约

一、分层领域模型规约

  • PO(persistant object):持久对象。最形象的理解就是一个PO就是数据库中的一条记录。好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。
  • DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
  • DAO(Data access object):数据访问对象,这个模式中有个接口就是DAO,负责持久层的操作。为业务层提供接口,此对象用于访问数据库。DAO中包含了各种数据库的操作方法。结合PO对数据库进行相关操作。夹在业务逻辑与数据库资源中间。配合VO,提供数据库的 CRUD 操作。
  • DTO(Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
  • BO(Business Object):业务对象。由Service层输出的封装业务逻辑的对象。
  • AO(Application Object):应用对象。在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
    - VO(View Object):显示层对象(视图对象),通常是Web向模板渲染引擎层传输的对象。接受页面传递来的数据,封装对象,或将业务处理完成的对象,封装成页面要用的数据。
  • Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输。

二、领域模型命名规约

  • 数据对象:xxxDO,xxx即为数据表名。
  • 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
  • 展示对象:xxxVO,xxx一般为网页名称。
  • POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。

三、Service/DAO层方法命名规约

  • 获取单个对象的方法用get做前缀。
  • 获取多个对象的方法用list做前缀,复数形式结尾如:listObjects。
  • 获取统计值的方法用count做前缀。
  • 插入的方法用save/insert做前缀。
  • 删除的方法用remove/delete做前缀。
  • 修改的方法用update做前缀。

参考:阿里巴巴Java开发手册(华山版)

四、实战

创建属性VO com/atguigu/gulimall/product/vo/AttrVo.java

package com.atguigu.gulimall.product.vo;

import lombok.Data;

/**
 * @author: kaiyi
 * @create: 2020-08-23 13:26
 */
@Data
public class AttrVo {
  /**
   * 属性id
   */
  // @TableId // vo不需要标注和数据库相关的注解
  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;

  /**
   * 属性分组ID(表里边是没有该字段的)
   *
   */
  private Long attrGroupId;

}

将页面提交的数据保存,修改Controller的参数对象AttrEntity改为 AttrVo
com/atguigu/gulimall/product/controller/AttrController.java

 /**
     * 保存
     */
    @RequestMapping("/save")
    //@RequiresPermissions("product:attr:save")
    // @RequestBody AttrEntity attr 更改为vo
    public R save(@RequestBody AttrVo attr){

        // attrService.save(attr);
        attrService.saveAttr(attr);

        return R.ok();
    }

添加接口方法:
com/atguigu/gulimall/product/service/AttrService.java

/**
 * 商品属性
 *
 * @author kaiyi
 * @email corwienwong@gmail.com
 * @date 2020-08-10 15:45:20
 */
public interface AttrService extends IService<AttrEntity> {

    PageUtils queryPage(Map<String, Object> params);

  void saveAttr(AttrVo attr);
}

方法实现:
com/atguigu/gulimall/product/service/impl/AttrServiceImpl.java

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

    @Autowired
    AttrAttrgroupRelationDao relationDao;

        @Transactional
    @Override
    public void saveAttr(AttrVo attr) {
        AttrEntity attrEntity = new AttrEntity();  // 这是一个PO,来对应数据库的

        // 传统做法是将页面提交过来的额数据 AttrVo 通过get()获取一个个对应到 AttrEntity 对象中,然后再保存
        // attrEntity.setAttrName(attr.getAttrName());

        // 新做法,可以使用springbeans提供的属性复制方法,将一个对象属性复制到另一个对象中,提前是Vo和PO的属性名必须是一一对应的
        BeanUtils.copyProperties(attr, attrEntity);

        // 1、保存基本对象
        this.save(attrEntity);

        // 2.保存关联关系
        AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
        relationEntity.setAttrGroupId(attr.getAttrGroupId());
        relationEntity.setAttrId(attrEntity.getAttrId());
        relationDao.insert(relationEntity);
    }
}

相关文章:
VO/DTO/DO/PO/POJO/BO/DAO 概念及区别

为者常成,行者常至