3.4实体类设计

分类: 搭建单体商城服务

实体类设计

实体类是数据模型的核心,它映射数据库表结构,封装业务数据。合理设计实体类能够提高代码可读性和维护性。本节将学习如何设计实体类。

本节将学习:Entity 类编写、Lombok 使用、字段映射,以及关系映射。

Entity 类编写

实体类规范

实体类设计规范:

  1. 类名:使用表名对应的实体类名(首字母大写,驼峰命名)
  2. 字段:对应数据库表的列
  3. 注解:使用 MyBatis-Plus 注解标识表名、主键等
  4. Lombok:使用 Lombok 简化代码

用户实体类

package com.example.ecommerce.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.time.LocalDateTime; @Data @TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; private String username; private String email; private String phone; private String password; private String nickname; private String avatar; private Integer status; private LocalDateTime createTime; private LocalDateTime updateTime; }

商品实体类

package com.example.ecommerce.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @TableName("product") public class Product { @TableId(type = IdType.AUTO) private Long id; private String name; private String description; private BigDecimal price; private Integer stock; private Long categoryId; private String imageUrl; private Integer status; private LocalDateTime createTime; private LocalDateTime updateTime; }

订单实体类

package com.example.ecommerce.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @TableName("order") public class Order { @TableId(type = IdType.AUTO) private Long id; private String orderNo; private Long userId; private BigDecimal totalAmount; private Integer status; private String shippingAddress; private LocalDateTime createTime; private LocalDateTime updateTime; }

Lombok 使用

Lombok 简介

Lombok 是一个 Java 库,通过注解自动生成 getter、setter、toString、equals、hashCode 等方法,减少样板代码。

Lombok 依赖

<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>

Lombok 常用注解

常用注解说明:

  1. @Data:生成 getter、setter、toString、equals、hashCode
  2. @Getter:生成 getter 方法
  3. @Setter:生成 setter 方法
  4. @ToString:生成 toString 方法
  5. @EqualsAndHashCode:生成 equals 和 hashCode 方法
  6. @NoArgsConstructor:生成无参构造函数
  7. @AllArgsConstructor:生成全参构造函数
  8. @Builder:生成建造者模式代码

Lombok 使用示例

// 使用 @Data 注解 @Data @TableName("user") public class User { // 自动生成 getter、setter、toString、equals、hashCode } // 使用 @Builder 注解 @Data @Builder @NoArgsConstructor @AllArgsConstructor @TableName("user") public class User { // 可以使用建造者模式创建对象 // User user = User.builder() // .username("admin") // .email("admin@example.com") // .build(); }

字段映射

字段映射规则

MyBatis-Plus 字段映射规则:

  1. 默认规则:实体类字段名与数据库列名一致(驼峰转下划线)
  2. @TableField:指定数据库列名
  3. @TableId:指定主键字段
  4. 忽略字段:使用 @TableField(exist = false) 忽略不映射的字段

字段映射示例

@Data @TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; // 字段名与列名一致,无需注解 private String username; // 字段名与列名不一致,使用 @TableField 指定 @TableField("email_address") private String email; // 不映射到数据库的字段 @TableField(exist = false) private String confirmPassword; // 自动映射(create_time -> createTime) private LocalDateTime createTime; }

主键策略

主键策略说明:

  • AUTO:数据库自增(MySQL)
  • NONE:无状态
  • INPUT:手动输入
  • ASSIGN_ID:分配 ID(雪花算法)
  • ASSIGN_UUID:分配 UUID

关系映射

一对一关系

@Data @TableName("order") public class Order { @TableId(type = IdType.AUTO) private Long id; private String orderNo; private Long userId; // 一对一关系(不映射到数据库) @TableField(exist = false) private User user; }

一对多关系

@Data @TableName("order") public class Order { @TableId(type = IdType.AUTO) private Long id; private String orderNo; // 一对多关系(不映射到数据库) @TableField(exist = false) private List<OrderItem> orderItems; }

多对一关系

@Data @TableName("order_item") public class OrderItem { @TableId(type = IdType.AUTO) private Long id; private Long orderId; private Long productId; // 多对一关系(不映射到数据库) @TableField(exist = false) private Order order; @TableField(exist = false) private Product product; }

实体类设计最佳实践

设计原则

最佳实践:

  1. 单一职责:一个实体类对应一张表
  2. 清晰命名:类名和字段名要有意义
  3. 合理使用注解:使用 Lombok 简化代码
  4. 类型安全:使用包装类型(Long、Integer)而不是基本类型
  5. 时间字段:使用 LocalDateTime 而不是 Date

完整实体类示例

用户实体类(完整版)

package com.example.ecommerce.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.time.LocalDateTime; @Data @Builder @NoArgsConstructor @AllArgsConstructor @TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; private String username; private String email; private String phone; private String password; private String nickname; private String avatar; private Integer status; private LocalDateTime createTime; private LocalDateTime updateTime; }

官方资源

本节小结

在本节中,我们学习了:

第一个是 Entity 类编写。 实体类映射数据库表结构,使用 MyBatis-Plus 注解标识。

第二个是 Lombok 使用。 使用 Lombok 注解简化代码,减少样板代码。

第三个是字段映射。 使用 @TableField 和 @TableId 注解控制字段映射。

第四个是关系映射。 使用 @TableField(exist = false) 处理实体类之间的关系。

这就是实体类设计。合理设计实体类,能够提高代码质量和开发效率。

在下一节,我们将学习如何实现 Repository 层,使用 MyBatis-Plus 的 BaseMapper。