• 前置条件
    • 介绍
    • 编写entity
      • 属性规范
      • TaskE.java 代码
      • UserE.java 代码
    • 编写Convertor 类
      • 创建对应的DTO 类。
      • UserConvertor.java 代码
      • TaskConvertor.java 代码
    • 编写Repository
      • Repository 接口类
      • UserRepository.java 代码
      • TaskRepository.java 代码
      • Repository 实现类
      • UserRepositoryImpl.java 代码
      • TaskRepositoryImpl.java 代码
    • 编写Service
      • Domain Service 接口类
      • Service 实现类

    前置条件

    在开发之前,请确保

    • 本地项目已经创建成功,详见 新建项目
    • 数据库创建成功,详见 初始化数据库

    介绍

    demo需涉及到demain层的entityconvertor、多entityservicerepository接口类以及infra层的repository实现类

    编写entity

    • entity 类需提供属性及简单行为
    • 创建在 项目模块 的 xxx.domain.[模块名称] 包下。如:xxx.domain.todo
    • 每一个 entity 类对应一个 DO 类,所以命名为 DO 类名尾缀替换为 E。如:TaskE 对应 DOTaskDO

    属性规范

    • 所有属性均为private属性。
    • 每一个属性需要生成对应的 getter 方法,不允许生成 setter 方法。
    • 需添加Long类型属性 objectVersionNumber ,用以更新数据时的版本控制。

    TaskE.java 代码

    1. package io.choerodon.todo.domain.todo.entity;
    2. public class TaskE {
    3. private Long id;
    4. private Long employeeId;
    5. private String state;
    6. private String taskNumber;
    7. private String taskDescription;
    8. private Long objectVersionNumber;
    9. public TaskE(Long id, Long employeeId, String state, String taskNumber, String taskDescription, Long objectVersionNumber) {
    10. this.id = id;
    11. this.employeeId = employeeId;
    12. this.state = state;
    13. this.taskNumber = taskNumber;
    14. this.taskDescription = taskDescription;
    15. this.objectVersionNumber = objectVersionNumber;
    16. }
    17. // 更新状态
    18. public void updateState(String state) {
    19. this.state = state;
    20. }
    21. // 省略get方法
    22. }

    UserE.java 代码

    1. package io.choerodon.todo.domain.todo.entity;
    2. public class UserE {
    3. private Long id;
    4. private String employeeName;
    5. private String employeeNumber;
    6. private String email;
    7. private Long objectVersionNumber;
    8. public UserE(Long id, String employeeName, String employeeNumber, String email, Long objectVersionNumber) {
    9. this.id = id;
    10. this.employeeName = employeeName;
    11. this.employeeNumber = employeeNumber;
    12. this.email = email;
    13. this.objectVersionNumber = objectVersionNumber;
    14. }
    15. // 省略get方法
    16. }

    编写Convertor 类

    • convertor用于EntityDODTO三者之间的转换,需继承ConvertorI<E, D, T>接口,EDT对应具体的EntityDODTO
    • 每一个 convertor 类对应一组EDT,所以命名为同组类名尾缀替换为 Convertor。如:TaskConvertor
    • 需要通过@Component纳入spring管理。

    创建对应的DTO 类。

    io.choerodon.todo.api.dto包下创建DTO类。

    1. // UserDTO
    2. package io.choerodon.todo.api.dto;
    3. public class UserDTO {
    4. private Long id;
    5. private String employeeName;
    6. private String employeeNumber;
    7. private String email;
    8. private Long objectVersionNumber;
    9. // 省略get和set方法
    10. }
    1. // TaskDTO
    2. package io.choerodon.todo.api.dto;
    3. public class TaskDTO {
    4. private Long id;
    5. private Long employeeId;
    6. private String state;
    7. private String taskNumber;
    8. private String taskDescription;
    9. private Long objectVersionNumber;
    10. // 省略get和set方法
    11. }

    UserConvertor.java 代码

    1. package io.choerodon.todo.domain.todo.convertor;
    2. // 省略 import
    3. @Component
    4. public class UserConvertor implements ConvertorI<UserE, UserDO, UserDTO> {
    5. @Override
    6. public UserE dtoToEntity(UserDTO dto) {
    7. return new UserE(
    8. dto.getId(),
    9. dto.getEmployeeName(),
    10. dto.getEmployeeNumber(),
    11. dto.getEmail(),
    12. dto.getObjectVersionNumber()
    13. );
    14. }
    15. @Override
    16. public UserDTO entityToDto(UserE entity) {
    17. UserDTO UserDTO = new UserDTO();
    18. BeanUtils.copyProperties(entity, UserDTO);
    19. return UserDTO;
    20. }
    21. @Override
    22. public UserE doToEntity(UserDO dataObject) {
    23. return new UserE(
    24. dataObject.getId(),
    25. dataObject.getEmployeeName(),
    26. dataObject.getEmployeeNumber(),
    27. dataObject.getEmail(),
    28. dataObject.getObjectVersionNumber()
    29. );
    30. }
    31. @Override
    32. public UserDO entityToDo(UserE entity) {
    33. UserDO UserDO = new UserDO();
    34. BeanUtils.copyProperties(entity, UserDO);
    35. return UserDO;
    36. }
    37. @Override
    38. public UserDTO doToDto(UserDO dataObject) {
    39. UserDTO UserDTO = new UserDTO();
    40. BeanUtils.copyProperties(dataObject, UserDTO);
    41. return UserDTO;
    42. }
    43. public UserDO dtoToDo(UserDTO dto) {
    44. UserDO UserDO = new UserDO();
    45. BeanUtils.copyProperties(dto, UserDO);
    46. return UserDO;
    47. }
    48. }

    TaskConvertor.java 代码

    1. package io.choerodon.todo.domain.todo.convertor;
    2. // 省略 import
    3. @Component
    4. public class TaskConvertor implements ConvertorI<TaskE, TaskDO, TaskDTO> {
    5. @Override
    6. public TaskE dtoToEntity(TaskDTO dto) {
    7. return new TaskE(
    8. dto.getId(),
    9. dto.getEmployeeId(),
    10. dto.getState(),
    11. dto.getTaskNumber(),
    12. dto.getTaskDescription(),
    13. dto.getObjectVersionNumber()
    14. );
    15. }
    16. @Override
    17. public TaskDTO entityToDto(TaskE entity) {
    18. TaskDTO taskDTO = new TaskDTO();
    19. BeanUtils.copyProperties(entity, taskDTO);
    20. return taskDTO;
    21. }
    22. @Override
    23. public TaskE doToEntity(TaskDO dataObject) {
    24. return new TaskE(
    25. dataObject.getId(),
    26. dataObject.getEmployeeId(),
    27. dataObject.getState(),
    28. dataObject.getTaskNumber(),
    29. dataObject.getTaskDescription(),
    30. dataObject.getObjectVersionNumber()
    31. );
    32. }
    33. @Override
    34. public TaskDO entityToDo(TaskE entity) {
    35. TaskDO taskDO = new TaskDO();
    36. BeanUtils.copyProperties(entity, taskDO);
    37. return taskDO;
    38. }
    39. @Override
    40. public TaskDTO doToDto(TaskDO dataObject) {
    41. TaskDTO taskDTO = new TaskDTO();
    42. BeanUtils.copyProperties(dataObject, taskDTO);
    43. return taskDTO;
    44. }
    45. public TaskDO dtoToDo(TaskDTO dto) {
    46. TaskDO taskDO = new TaskDO();
    47. BeanUtils.copyProperties(dto, taskDO);
    48. return taskDO;
    49. }
    50. }

    编写Repository

    Repository 接口类

    • Repository 接口类定义了数据操作的一系列接口,并不提供实现,具体实现需要通过 Repository实现层提供。创建在项目模块的 xxx.domain.repository 包下。
    • 每一个 Repository 对应一个 entity ,所以命名为 entity 类名尾缀替换为 Repository。如:TaskRepository 对应 TaskE

    UserRepository.java 代码

    1. package io.choerodon.todo.domain.repository;
    2. import io.choerodon.todo.domain.todo.entity.UserE;
    3. public interface UserRepository {
    4. UserE create(UserE userE);
    5. }

    TaskRepository.java 代码

    1. package io.choerodon.todo.domain.repository;
    2. import io.choerodon.todo.domain.todo.entity.TaskE;
    3. public interface TaskRepository {
    4. TaskE create(TaskE taskE);
    5. void deleteById(Long id);
    6. void deleteByTaskNumber(String taskNumber);
    7. TaskE update(TaskE taskE);
    8. TaskE queryById(Long id);
    9. }

    Repository 实现类

    • Repository 接口的集体实现。创建在项目模块的 xxx.infra.repository.impl 包下。
    • 每一个 Repository 实现类对应一个 Repository 接口类,所以命名为 Repository 接口类名 + Impl。如:TaskRepositoryImpl 对应 TaskRepository
    • 需要通过@Component纳入spring管理。

    UserRepositoryImpl.java 代码

    1. package io.choerodon.todo.infra.repository.impl;
    2. // 省略 import
    3. @Component
    4. public class UserRepositoryImpl implements UserRepository {
    5. private UserMapper userMapper;
    6. private UserConvertor userConvertor;
    7. public UserRepositoryImpl(UserMapper userMapper, UserConvertor userConvertor) {
    8. this.userMapper = userMapper;
    9. this.userConvertor = userConvertor;
    10. }
    11. @Override
    12. public UserE create(UserE userE) {
    13. UserDO userDO = userConvertor.entityToDo(userE);
    14. List<UserDO> userDOList = userMapper.select(userDO);
    15. if (!userDOList.isEmpty()) {
    16. throw new CommonException("error.repo.create.user.exist");
    17. }
    18. if (userMapper.insertSelective(userDO) != 1) {
    19. throw new CommonException("error.repo.create.user.failed");
    20. }
    21. return userConvertor.doToEntity(userMapper.selectByPrimaryKey(userDO.getId()));
    22. }
    23. }

    TaskRepositoryImpl.java 代码

    1. package io.choerodon.todo.infra.repository.impl;
    2. // 省略 import
    3. @Component
    4. public class TaskRepositoryImpl implements TaskRepository {
    5. private TaskMapper taskMapper;
    6. private TaskConvertor taskConvertor;
    7. public TaskRepositoryImpl(TaskMapper taskMapper, TaskConvertor taskConvertor) {
    8. this.taskMapper = taskMapper;
    9. this.taskConvertor = taskConvertor;
    10. }
    11. @Override
    12. public TaskE create(TaskE taskE) {
    13. TaskDO taskDO = taskConvertor.entityToDo(taskE);
    14. List<TaskDO> taskDOList = taskMapper.select(taskDO);
    15. if (!taskDOList.isEmpty()) {
    16. throw new CommonException("error.repo.create.task.exist");
    17. }
    18. if (taskMapper.insertSelective(taskDO) != 1) {
    19. throw new CommonException("error.repo.create.task.failed");
    20. }
    21. return new TaskConvertor().doToEntity(taskMapper.selectByPrimaryKey(taskDO.getId()));
    22. }
    23. @Override
    24. public TaskE queryById(Long id) {
    25. return taskConvertor.doToEntity(taskMapper.selectByPrimaryKey(id));
    26. }
    27. @Override
    28. public void deleteById(Long id) {
    29. if (taskMapper.selectByPrimaryKey(id) == null) {
    30. throw new CommonException("error.task.not.exist");
    31. }
    32. if (taskMapper.deleteByPrimaryKey(id) != 1) {
    33. throw new CommonException("error.task.delete");
    34. }
    35. }
    36. @Override
    37. public void deleteByTaskNumber(String taskNumber) {
    38. TaskDO taskDO = taskMapper.queryByTaskNumber(taskNumber);
    39. if (taskDO == null) {
    40. throw new CommonException("error.task.not.exist");
    41. }
    42. if (taskMapper.deleteByPrimaryKey(taskDO.getId()) != 1) {
    43. throw new CommonException("error.task.delete");
    44. }
    45. }
    46. @Override
    47. public TaskE update(TaskE taskE) {
    48. TaskDO taskDO = taskConvertor.entityToDo(taskE);
    49. if (taskMapper.updateByPrimaryKeySelective(taskDO) != 1) {
    50. throw new CommonException("error.task.update");
    51. }
    52. return taskConvertor.doToEntity(taskMapper.selectByPrimaryKey(taskDO.getId()));
    53. }
    54. }

    编写Service

    Domain Service 接口类

    • 领域层的Service 是业务软件的核心,是反应多个领域模型的业务情况的具体实现,是领域模型对外提供的实际服务。
    • Service 接口类定义了业务操作的一系列接口,并不提供实现,具体实现需要通过服务实现层提供,所以属于供应方的服务接口层。创建在项目模块 的 xxx.domain.service 包下。
    • 每一个 Service 对应多个 entity 类,因需要与appservice区分,所以规定命名为 I + 涉及主要entity类名 + Service。如:ITaskService

    Service 实现类

    • Service 接口的具体实现通过服务实现层提供,所以属于供应方的服务实现层。创建在项目模块的 xxx.domian.service.impl 包下。
    • 实现类,如无特殊情况,需要用 @Service 标注,以自动扫描注册