3.4、实体类设计
分类: 搭建单体商城服务
实体类设计
实体类是数据模型的核心,它映射数据库表结构,封装业务数据。合理设计实体类能够提高代码可读性和维护性。本节将学习如何设计实体类。
本节将学习:Entity 类编写、Lombok 使用、字段映射,以及关系映射。
Entity 类编写
实体类规范
实体类设计规范:
- 类名:使用表名对应的实体类名(首字母大写,驼峰命名)
- 字段:对应数据库表的列
- 注解:使用 MyBatis-Plus 注解标识表名、主键等
- 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 常用注解
常用注解说明:
- @Data:生成 getter、setter、toString、equals、hashCode
- @Getter:生成 getter 方法
- @Setter:生成 setter 方法
- @ToString:生成 toString 方法
- @EqualsAndHashCode:生成 equals 和 hashCode 方法
- @NoArgsConstructor:生成无参构造函数
- @AllArgsConstructor:生成全参构造函数
- @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 字段映射规则:
- 默认规则:实体类字段名与数据库列名一致(驼峰转下划线)
- @TableField:指定数据库列名
- @TableId:指定主键字段
- 忽略字段:使用
@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; }
实体类设计最佳实践
设计原则
最佳实践:
- 单一职责:一个实体类对应一张表
- 清晰命名:类名和字段名要有意义
- 合理使用注解:使用 Lombok 简化代码
- 类型安全:使用包装类型(Long、Integer)而不是基本类型
- 时间字段:使用 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; }
官方资源
- MyBatis-Plus 实体类:https://baomidou.com/pages/223848/
- Lombok 官方文档:https://projectlombok.org/
- Java 时间 API:https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html
本节小结
在本节中,我们学习了:
第一个是 Entity 类编写。 实体类映射数据库表结构,使用 MyBatis-Plus 注解标识。
第二个是 Lombok 使用。 使用 Lombok 注解简化代码,减少样板代码。
第三个是字段映射。 使用 @TableField 和 @TableId 注解控制字段映射。
第四个是关系映射。 使用 @TableField(exist = false) 处理实体类之间的关系。
这就是实体类设计。合理设计实体类,能够提高代码质量和开发效率。
在下一节,我们将学习如何实现 Repository 层,使用 MyBatis-Plus 的 BaseMapper。