3. Java機能開発

1. 機能開発の基本フロー

BaiZe FrameworkでのJava機能開発は、以下の手順で進めます:

1

エンティティ作成

データベーステーブルに対応するエンティティクラスを作成します。

2

DAO作成

MyBatis-PlusのBaseMapperを継承したMapperインターフェースを作成します。

3

Manager作成

ServiceImplを継承したマネージャクラスで複雑なビジネスロジックを処理します。

4

Service作成

ManagerとDAOを注入してビジネスロジックを編成します。

5

Controller作成

HTTPリクエストを処理するコントローラを作成します。

6

FormとVO作成

リクエストパラメータ受信用のFormと、レスポンス返信用のVOを作成します。

2. エンティティの作成

エンティティクラスはデータベーステーブルに対応し、@TableNameアノテーションでテーブル名を指定します。

@TableName("t_employee")
public class EmployeeEntity {

    @TableId(type = IdType.AUTO)
    private Long employeeId;

    private String employeeName;

    private Long departmentId;

    private Boolean deletedFlag;

    private Date createTime;

    private Date updateTime;

    private Long createUserId;

    private Long updateUserId;
}

エンティティの基本規約

  • @TableNameでテーブル名を指定
  • 主キーは@TableId(type = IdType.AUTO)を指定
  • 論理削除フィールド:deletedFlag(Boolean)
  • 基本フィールド:createTime、updateTime、createUserId、updateUserId

3. DAOの作成

DAOはMyBatis-PlusのBaseMapperを継承し、@Mapperアノテーションを付けます。

@Mapper
public interface EmployeeDao extends BaseMapper<EmployeeEntity> {

}

4. Managerの作成

ManagerはServiceImplを継承し、複数テーブル操作や複雑なビジネスロジックを処理します。トランザクションはこの層で管理します。

@Service
public class EmployeeManager extends ServiceImpl<EmployeeDao, EmployeeEntity> {

    @Autowired
    private DepartmentDao departmentDao;

    /**
     * 従業員と部門の結合データを取得
     */
    public EmployeeVO getEmployeeWithDepartment(Long employeeId) {
        EmployeeEntity employee = this.getById(employeeId);
        if (employee == null) {
            return null;
        }

        DepartmentEntity department = departmentDao.selectById(employee.getDepartmentId());

        EmployeeVO vo = new EmployeeVO();
        BeanUtils.copyProperties(employee, vo);
        if (department != null) {
            vo.setDepartmentName(department.getDepartmentName());
        }

        return vo;
    }
}

5. Serviceの作成

ServiceはManagerとDAOを注入し、ビジネスロジックを編成します。

@Service
public class EmployeeService {

    @Autowired
    private EmployeeManager employeeManager;

    @Autowired
    private EmployeeDao employeeDao;

    /**
     * 従業員一覧を取得
     */
    public PageResult<EmployeeVO> queryEmployee(EmployeeQueryForm form) {
        LambdaQueryWrapper<EmployeeEntity> wrapper = new LambdaQueryWrapper<>();

        if (StringUtils.isNotBlank(form.getEmployeeName())) {
            wrapper.like(EmployeeEntity::getEmployeeName, form.getEmployeeName());
        }

        if (form.getDepartmentId() != null) {
            wrapper.eq(EmployeeEntity::getDepartmentId, form.getDepartmentId());
        }

        wrapper.orderByDesc(EmployeeEntity::getCreateTime);

        Page<EmployeeEntity> page = employeeDao.selectPage(new Page<>(form.getPageNum(), form.getPageSize()), wrapper);

        return PageResult.of(page, EmployeeVO.class);
    }
}

6. Controllerの作成

ControllerはHTTPリクエストを処理し、Serviceを呼び出して業務処理を行います。

@RestController
@RequestMapping("/api/employee")
public class EmployeeController extends SmartBaseController {

    @Autowired
    private EmployeeService employeeService;

    /**
     * 従業員一覧を取得
     */
    @PostMapping("/query")
    @OperateLog
    public ResponseDTO<PageResult<EmployeeVO>> queryEmployee(@RequestBody @Valid EmployeeQueryForm form) {
        return ResponseDTO.ok(employeeService.queryEmployee(form));
    }

    /**
     * 従業員を追加
     */
    @PostMapping("/add")
    @OperateLog
    public ResponseDTO<String> addEmployee(@RequestBody @Valid EmployeeAddForm form) {
        return ResponseDTO.ok(employeeService.addEmployee(form));
    }

    /**
     * 従業員を更新
     */
    @PostMapping("/update")
    @OperateLog
    public ResponseDTO<String> updateEmployee(@RequestBody @Valid EmployeeUpdateForm form) {
        return ResponseDTO.ok(employeeService.updateEmployee(form));
    }

    /**
     * 従業員を削除
     */
    @PostMapping("/delete")
    @OperateLog
    public ResponseDTO<String> deleteEmployee(@RequestBody @Valid EmployeeDeleteForm form) {
        return ResponseDTO.ok(employeeService.deleteEmployee(form.getEmployeeId()));
    }
}

7. FormとVOの作成

Form(リクエストパラメータ)

/**
 * 従業員追加フォーム
 */
public class EmployeeAddForm extends BaseForm {

    @NotBlank(message = "従業員名を入力してください")
    @Length(max = 50, message = "従業員名は50文字以内で入力してください")
    private String employeeName;

    @NotNull(message = "部門IDを選択してください")
    private Long departmentId;

    // getters and setters
}

VO(レスポンスデータ)

/**
 * 従業員VO
 */
public class EmployeeVO {

    private Long employeeId;

    private String employeeName;

    private Long departmentId;

    private String departmentName;

    private Date createTime;

    // getters and setters
}

8. 開発時の注意事項

8.1 トランザクション管理

  • @Transactionalアノテーションはmanager層で使用します
  • トランザクション境界を明確にするため、service層には@Temporalアノテーションを使用しないでください

8.2 リクエストユーザーの取得

現在のログインユーザー情報を取得するには、RequestUserを使用します。

RequestUser requestUser = SmartRequestUtil.getRequestUser();

8.3 ページングクエリ

  • リクエストパラメータはPageParamで受信
  • レスポンスデータはPageResult<T>で返却

8.4 重複送信防止

@RepeatSubmitアノテーションを使用して重複送信を防止します。

8.5 パラメータ検証

javax.validationアノテーションを使用してパラメータを検証します。