開発ガイド
BaiZe Frameworkで開発を始めるための完全ガイド
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アノテーションを使用してパラメータを検証します。