前置条件

    • 本地项目已经创建成功,详见 新建项目
    • 数据库创建成功,详见
    • entity 类需提供属性及简单行为
    • 创建在 项目模块 的 xxx.domain.[模块名称] 包下。如:xxx.domain.todo
    • 每一个 entity 类对应一个 DO 类,所以命名为 DO 类名尾缀替换为 E。如:TaskE 对应 DOTaskDO
    • 所有属性均为private属性。
    • 每一个属性需要生成对应的 getter 方法,不允许生成 setter 方法。
    • 需添加Long类型属性 objectVersionNumber ,用以更新数据时的版本控制。

    TaskE.java 代码

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

    创建对应的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. 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.getEmail(),
    11. dto.getObjectVersionNumber()
    12. }
    13. @Override
    14. public UserDTO entityToDto(UserE entity) {
    15. UserDTO UserDTO = new UserDTO();
    16. BeanUtils.copyProperties(entity, UserDTO);
    17. return UserDTO;
    18. }
    19. @Override
    20. public UserE doToEntity(UserDO dataObject) {
    21. return new UserE(
    22. dataObject.getId(),
    23. dataObject.getEmployeeName(),
    24. dataObject.getEmployeeNumber(),
    25. dataObject.getEmail(),
    26. dataObject.getObjectVersionNumber()
    27. );
    28. }
    29. @Override
    30. public UserDO entityToDo(UserE entity) {
    31. UserDO UserDO = new UserDO();
    32. BeanUtils.copyProperties(entity, UserDO);
    33. return UserDO;
    34. }
    35. @Override
    36. public UserDTO doToDto(UserDO dataObject) {
    37. UserDTO UserDTO = new UserDTO();
    38. BeanUtils.copyProperties(dataObject, UserDTO);
    39. return UserDTO;
    40. }
    41. public UserDO dtoToDo(UserDTO dto) {
    42. UserDO UserDO = new UserDO();
    43. BeanUtils.copyProperties(dto, UserDO);
    44. return UserDO;
    45. }
    46. }

    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. @Override
    33. public TaskDO entityToDo(TaskE entity) {
    34. TaskDO taskDO = new TaskDO();
    35. BeanUtils.copyProperties(entity, taskDO);
    36. return taskDO;
    37. @Override
    38. public TaskDTO doToDto(TaskDO dataObject) {
    39. TaskDTO taskDTO = new TaskDTO();
    40. BeanUtils.copyProperties(dataObject, taskDTO);
    41. return taskDTO;
    42. }
    43. public TaskDO dtoToDo(TaskDTO dto) {
    44. TaskDO taskDO = new TaskDO();
    45. BeanUtils.copyProperties(dto, taskDO);
    46. return taskDO;
    47. }
    48. }

    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.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 代码

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

    Service 实现类

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