代码写了那么多,CURD也可以如此简单(下)?

[toc]

话说进入一家公司,如果经常CURD,是不是感觉很枯燥,但是自己有没有想过,写了一个模块又一个模块,怎么能让自己的代码稍微提高些逼格呢?本文就是基于此背景,应运而生。

1.准备

我们如果创建的工程基于SpringBoot+MyBatis,那么接下来,就可以使用上文的抽象模块了。《代码写了那么多,CURD也可以如此简单(上)?》

2.开始

2.1 定义一个ORM实体

/**
 * @description: 城市运营业务实体类
 * @Date : 2019/8/15 下午1:35
 * @Author : 石冬冬-Seig Heil
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CityOperationBuz extends BaseEntity {
    private static final long serialVersionUID = -8803890133202877257L;

    @ApiModelProperty(value="省份名称")
    private String provinceName;

    @ApiModelProperty(value="城市RegCode")
    private String cityRegCode;

    @ApiModelProperty(value="城市国标码")
    private String cityGbCode;

    @ApiModelProperty(value="城市名称")
    private String cityName;

    @ApiModelProperty(value="业务类型")
    private Integer buzType;

    @ApiModelProperty(value="创建时间")
    private Date createdTime;
}

public class BaseEntity implements Serializable {
    private static final long serialVersionUID = 3701596343879071709L;
    @ApiModelProperty(
        name = "id",
        value = "id",
        dataType = "Integer"
    )
    private Integer id;

    public BaseEntity() {
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}
复制代码

2.2 定义一个VO实体

VO的作用用于把entity展现的view视图层。

/**
 * @description: 城市运营业务VO类
 * @Date : 2019/8/15 下午1:35
 * @Author : 石冬冬-Seig Heil
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CityOperationBuzVo implements Serializable {
    private static final long serialVersionUID = 3103330741697197876L;
    @ApiModelProperty(value="id")
    private Integer id;

    @ApiModelProperty(value="省份名称")
    private String provinceName;

    @ApiModelProperty(value="城市RegCode")
    private String cityRegCode;

    @ApiModelProperty(value="城市国标码")
    private String cityGbCode;

    @ApiModelProperty(value="城市名称")
    private String cityName;

    @ApiModelProperty(value="业务类型")
    private Integer buzType;

    @ApiModelProperty(value="创建时间")
    private Date createdTime;
}
复制代码

2.3 定义一个Form

Form的作用用于封装页面查询条件。

/**
 * @description: 城市运营业务实体类
 * @Date : 2019/8/15 下午1:35
 * @Author : 石冬冬-Seig Heil
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CityOperationBuzForm extends BaseForm {

    private static final long serialVersionUID = -2192092804864722810L;

    @ApiModelProperty(value="省份名称")
    private String provinceName;

    @ApiModelProperty(value="城市RegCode")
    private String cityRegCode;

    @ApiModelProperty(value="城市国标码")
    private String cityGbCode;

    @ApiModelProperty(value="城市名称")
    private String cityName;

    @ApiModelProperty(value="业务类型")
    private Integer buzType;
}

/**
 * @description: Form基类
 * @Date : 下午4:13 2020/3/5
 * @Author : 石冬冬-Heil Hitler
 */
public class BaseForm implements Serializable{
    private static final long serialVersionUID = -7659575678494184665L;
    /**
     * 主键id
     */
    private Integer id;
    /**
     * 编码
     */
    private String code;
    /**
     * 名称
     */
    private String name;
    /**
     * 开始时间
     */
    private String beginTime;
    /**
     * 截止时间
     */
    private String endTime;
    /**
     * 是否分页
     */
    private boolean paging = true;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBeginTime() {
        return beginTime;
    }

    public void setBeginTime(String beginTime) {
        this.beginTime = beginTime;
    }

    public String getEndTime() {
        return endTime;
    }

    public void setEndTime(String endTime) {
        this.endTime = endTime;
    }

    public boolean isPaging() {
        return paging;
    }

    public void setPaging(boolean paging) {
        this.paging = paging;
    }
}
复制代码

2.4 定义Mapper

/**
 * @description: 城市运营业务 Mapper
 * @Date : 2019/8/15 下午1:45
 * @Author : 石冬冬-Seig Heil
 */
public interface CityOperationBuzMapper extends BaseMapper<CityOperationBuz,Integer,CityOperationBuzForm> {
}
复制代码

如上所示,只需要继承BaseMapper,并声明规约我们的Entity的CityOperationBuz、主键类型Integer、以及查询参数类CityOperationBuzForm

2.5 定义Service

/**
 * @description: 城市运营业务 Service
 * @Date : 2019/8/15 下午1:45
 * @Author : 石冬冬-Seig Heil
 */
public interface CityOperationBuzService extends BaseService<CityOperationBuz,Integer,CityOperationBuzForm> {
}
复制代码

如上所示,只需要继承BaseService,其他规约跟BaseMapper相同。

2.6 定义Service实现类

/**
 * @description: 城市运营业务 Service
 * @Date : 2019/8/15 下午1:45
 * @Author : 石冬冬-Seig Heil
 */
@Service
public class CityOperationBuzServiceImpl extends BaseServiceImpl<CityOperationBuz,Integer,CityOperationBuzForm> implements CityOperationBuzService {

    @Autowired
    CityOperationBuzMapper cityOperationBuzMapper;
}
复制代码

如上所示,需要继承BaseServiceImpl,并注入依赖CityOperationBuzMapper

2.7 定义Facade

/**
 * @description: 城市运营业务 Facade
 * @Date : 2019/8/15 下午1:49
 * @Author : 石冬冬-Seig Heil
 */
@Component
@Slf4j
public class CityOperationBuzFacade extends BaseFacadeImpl<CityOperationBuzVo,CityOperationBuz,Integer,CityOperationBuzForm> {

    @Autowired
    CityOperationBuzService cityOperationBuzService;

    @Override
    protected boolean isModify(CityOperationBuz CityOperationBuz) {
        return null != CityOperationBuz.getId();
    }

    @Override
    protected BaseConverter<CityOperationBuzVo, CityOperationBuz> converter() {
        return new CityOperationBuzConverter();
    }

    @Override
    public Result<String> saveRecord(CityOperationBuz record) {
        if(!isModify(record)){
            record.setCreatedTime(TimeTools.createNowTime());
        }
        return super.saveRecord(record);
    }
}
复制代码

如上所示,需要继承BaseFacadeImpl,并注入依赖CityOperationBuzService,其中并规约我们的VO类是CityOperationBuzVo

2.8 定义VO的转换器

/**
 * @description: 城市运营业务 转换器
 * @Date : 2019/8/15 下午1:48
 * @Author : 石冬冬-Seig Heil
 */
public class CityOperationBuzConverter extends BaseConverter<CityOperationBuzVo, CityOperationBuz> {
    @Override
    public CityOperationBuzVo convert( CityOperationBuz bo) {
        CityOperationBuzVo re = new  CityOperationBuzVo();
        BeanUtils.copyProperties(bo, re);
        return re;
    }
}
复制代码

2.9 定义Controller

/**
 * @description: 城市运营业务
 * @Date : 2019/8/15 下午1:56
 * @Author : 石冬冬-Seig Heil
 */
@RestController
@RequestMapping("/cityOperationBuz")
@Api(description = "城市运营业务",tags = "城市运营业务")
public class CityOperationBuzController {

    final String LOG_TITLE = "【城市运营业务】";

    @Autowired
    CityOperationBuzFacade cityOperationBuzFacade;

    /**
     * 加载列表
     * @return
     */
    @PostMapping("/loadRecords")
    @ApiOperation("加载列表")
    @LogMonitor(value = LOG_TITLE, action = @Action("加载列表"))
    public Result<PageVO<CityOperationBuzVo>> loadRecords(@RequestBody PageForm<CityOperationBuzForm> form) {
        return cityOperationBuzFacade.loadRecords(form);
    }


    /**
     * 查询详情
     * @return
     */
    @GetMapping("/queryRecord/{id}")
    @ApiOperation("查询详情")
    @LogMonitor(value = LOG_TITLE, action = @Action("查询详情"))
    public Result<List<CityOperationBuzVo>> queryRecord(@PathVariable Integer id) {
        return cityOperationBuzFacade.queryRecord(id);
    }

    /**
     * 保存
     * @return
     */
    @PostMapping("/saveRecord")
    @ApiOperation("保存")
    @LogMonitor(value = LOG_TITLE, action = @Action("保存"))
    @OperateLogger(value = 100017,refId = "id",modifyCondition = "null != id")
    public Result<String> saveRecord(@RequestBody CityOperationBuz cityOperationBuz) {
        return cityOperationBuzFacade.saveRecord(cityOperationBuz);
    }

    /**
     * 删除
     * @return
     */
    @GetMapping("/delRecord/{id}")
    @ApiOperation("删除")
    @LogMonitor(value = LOG_TITLE, action = @Action("删除"))
    @OperateLogger(value = 100017,logType = OperateLogger.LogType.D)
    public Result<String> delRecord(@PathVariable Integer id) {
        return cityOperationBuzFacade.deleteRecord(id);
    }
}
复制代码

3.总结

透过上述示例,我们可以得出,通过已有的BaseModule的抽象封装,使得我们只需要极少的代码,就可以实现一个基础的CURD模块,代码就是那么干净,整洁。

源码:gitee.com/suze/base-m…

下面的是我的公众号二维码图片,欢迎关注。

公众号

原文:blog.csdn.net/shichen2010…

猜你喜欢

转载自juejin.im/post/5e80942ff265da47e90cf12d