💾 数据持久化 & 持久层
数据库支持
ORM 框架
实体类
- 所有持久化实体类继承
BaseEntity基类。
ID编号
多租户
- 需要区分租户的所有表,均统一使用
tenant_id字段。
逻辑删除
- 系统中
逻辑删除标记是否删除字段为deleted。 - 🗑️ 逻辑删除支持
乐观锁
自动填充
- 基于
MyBatis自动填充机制,实现BaseEntity通用字段的自动填充赋值。 - 📝 自动填充字段
个性化字段处理
编码规范
- 分包类名规范:持久层实体类放在
entity包下,以Entity结尾;数据库访问类放在mapper包下,以Mapper结尾。 - 注释规范:持久层实体类的注释要完整,特别是哪些字段是关联(外键)、枚举、冗余等等。
- 操作规范:禁止在
Controller、Service中,直接进行MyBatis-Plus操作。原因是:大量 MyBatis 操作散落在 Service 中,会导致 Service 的代码越来乱,无法聚焦业务逻辑。 - 查询方法命名规范:
Mapper的SELECT查询方法的命名,采用Spring Data的"Query methods"`` 策略,方法名使用selectBy` 查询条件 规则。 - 条件构造器规范:优先使用
LambdaQueryWrapper条件构造器,使用方法获得字段名,避免手写`"字段"`` 可能写错的情况。 - 单表查询规范:简单的单表查询,优先在 Mapper 中通过 default 方法实现。
CRUD 接口
BaseMapperPlus接口,继承MyBatis-Plus的BaseMapper接口,提供更强的 CRUD 操作能力。
数据分页实现
条件构造器
- 继承
MyBatis-Plus的条件构造器,拓展了LambdaQueryWrapperPlus和QueryWrapperPlus类,主要是增加<xxx>IfPresent方法,用于判断值不存在的时候,不要拼接到条件中。
Mapper XML
- 默认配置下,
MyBatisMapper XML需要写在各自模块的resources/mapper目录下。 - 尽量避免数据库的
连表(多表)查询,而是采用多次查询,Java 内存拼接的方式替代。
字段加密
- 基于
TypeHandler,基于HutoolAES实现字段的解密与解密。 字段加密后,只允许使用精准匹配,无法使用模糊匹配。- 🔑 数据脱敏