当前位置: 首页 > news >正文

MyBatis Plus 对数据表常用注解

1. @TableName

(1) 解释说明

@TableName 注解用于 指定实体类对应的数据库表名,当实体类的名称与数据库表名不一致时,可以用此注解进行映射。此外,@TableName 还支持设置一些其他的配置选项,比如全局表名前缀、后缀的处理。
  • value:指定数据库表名。如果没有设置此注解,则会默认映射到与类名相同的表名。
  • schema:指定数据库的 schema,适用于多 schema 的情况。

(2) 应用示例

假设有一个 User 实体类对应数据库中的 user_info 表:
import com.baomidou.mybatisplus.annotation.TableName;@TableName("user_info")
public class User {private Long id;private String name;private Integer age;
}

如果不使用 @TableName,MyBatis-Plus 默认认为表名与类名一致,即表名为 user。此时需要用 @TableName("user_info") 来指定正确的表名。

(3) 使用场景

  • 表名与实体类名不一致:例如实体类名 User 对应表名 user_info。
  • 需要动态修改表名的场景:比如多租户情况下,不同租户的表前缀不同,使用 @TableName 可以灵活控制。

(4) 注意事项

  • 大小写问题:数据库表名的大小写敏感性因数据库类型而异(例如 MySQL 默认不区分大小写,而 PostgreSQL 区分)。因此,在使用 @TableName 时,确保表名与数据库一致。
  • 表前缀/后缀:在项目中可能有统一的前缀或后缀要求。使用 @TableName 可以覆盖全局配置中的前缀后缀。

2. @TableId

(1) 解释说明

@TableId 注解用于标识实体类中的主键字段,并且可以指定主键的生成策略。主键策略有多个选项:

  • IdType.AUTO:自增类型,通常用于数据库支持自动增长的字段(如 MySQL 的 AUTO_INCREMENT)。
  • IdType.ASSIGN_ID:全局唯一 ID,使用 MyBatis-Plus 提供的雪花算法生成主键 ID。
  • IdType.INPUT:由用户输入的 ID。
  • IdType.NONE:不使用 MyBatis-Plus 的主键生成策略。

(2) 应用示例

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;public class User {@TableId(value = "id", type = IdType.ASSIGN_ID)private Long id;  // 使用雪花算法生成主键private String name;private Integer age;
}

(3) 使用场景

  • 数据库支持自增主键:如 MySQL 中的 AUTO_INCREMENT。
  • 分布式系统中主键生成:如使用雪花算法(ASSIGN_ID),确保生成全局唯一 ID。
  • 手动输入主键值:当需要由应用层或用户控制主键生成时,使用 INPUT。

(4) 注意事项

  • 自增主键类型:若数据库表的主键使用了自增策略,@TableId(type = IdType.AUTO) 是最常用的方式。
  • 雪花 ID:ASSIGN_ID 生成的 ID 可以保证全局唯一,但生成的值是一个长整型 ID,需考虑前端显示时的精度问题(JavaScript 的整数精度限制)。
  • 主键名称与字段名称不一致:如果数据库字段名不为 id,必须使用 @TableId(value = "column_name") 显式指定。

3. @TableField

(1) 解释说明

@TableField 注解用于标识实体类中的非主键字段与数据库表的对应关系。可以设置字段映射关系、参与 SQL 操作的方式以及是否需要自动填充等。

  • value:指定数据库表的字段名。如果字段名与类属性名一致,可以省略。
  • exist:设置该字段是否为数据库表中的字段。false 表示该字段不映射到数据库表。
  • select:设置该字段是否在查询时被查询到,false 表示不查询。
  • fill:自动填充策略,控制插入或更新时字段的自动填充。

(2) 应用示例

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.FieldFill;public class User {@TableIdprivate Long id;@TableField("user_name")private String name;  // 映射到数据库的 user_name 字段@TableField(exist = false)private String tempData;  // 该字段不与数据库映射@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;  // 在插入时自动填充
}

(3) 使用场景

  • 字段名与数据库列名不一致:例如 Java 字段为 userName,而数据库字段为 user_name。
  • 不需要持久化的字段:例如 transient 字段,用 @TableField(exist = false) 标记不映射到数据库。
  • 自动填充:对于如创建时间、更新时间等字段,使用 @TableField(fill = FieldFill.INSERT) 配合 MetaObjectHandler 自动填充。

(4) 注意事项

  • exist = false 的字段不会出现在 SQL 中,因此不参与任何数据库操作。
  • 自动填充:需要实现 MetaObjectHandler 接口并注册到 MyBatis-Plus 配置中。
  • 性能:在大数据量情况下,尽量避免使用 select=false,因为会导致全表扫描。

4. @TableLogic

(1) 解释说明

@TableLogic 注解用于 实现逻辑删除。通过将数据库中的某个字段作为标记来表示记录是否被删除,而不是真正删除数据。这对于软删除(例如删除用户但保留其历史数据)非常有用。

  • value:表示未删除的标记值(默认为 0)。
  • delval:表示删除的标记值(默认为 1)。

(2) 应用示例

import com.baomidou.mybatisplus.annotation.TableLogic;public class User {@TableIdprivate Long id;private String name;@TableLogic(value = "0", delval = "1")private Integer deleted;  // 0 表示未删除,1 表示已删除
}

(3) 使用场景

  • 软删除:例如,删除用户或订单时不需要物理删除记录,而是通过设置某个字段值为删除标记来进行“删除”。
  • 审计功能:有时出于审计的需求,需要保留历史数据以便查询。

(4) 注意事项

  • deleted 字段必须存在,且需要明确其作用(例如,0 表示未删除,1 表示已删除)。
  • 查询时过滤已删除的数据:MyBatis-Plus 会自动为逻辑删除字段添加查询条件,防止查询到已删除的数据。但如果需要查询已删除的数据,需手动指定 Wrapper 进行查询。
  • 自动处理:MyBatis-Plus 会在执行 delete 操作时自动处理逻辑删除。若需要真正删除数据,可以调用 deleteById 等方法。
http://www.lryc.cn/news/600930.html

相关文章:

  • 【C++基础】指针常量 | 常量指针 | int* p | const int* p | int* const p| const int* const p
  • 鼎捷T100程序开发(双档程序开发)
  • Unity 实现帧率(FPS)显示功能
  • 手写PPO_clip(FrozenLake环境)
  • 智慧水库管理系统中标签工厂的建立方案
  • ARM SMMUv3控制器注册过程分析(八)
  • ISIS分片扩展实验案例
  • 【Android】内容提供器
  • Kubernetes 与 Docker的爱恨情仇
  • 1.安装anaconda详细步骤(含安装截图)
  • C++20 协程
  • ​机器学习从入门到实践:算法、特征工程与模型评估详解
  • 是德科技 | AI上车后,这条“高速公路”如何畅通?
  • 聚类-一种无监督分类算法
  • 聚类里面的一些相关概念介绍阐述
  • Digit Queries
  • OpenFeign-远程调用
  • 数据结构 二叉树(2)---二叉树的实现
  • excel删除重复项场景
  • HarmonyOS中的PX、 VP、 FP 、LPX、Percentage、Resource 详细区别是什么
  • 商汤InternLM发布最先进的开源多模态推理模型——Intern-S1
  • CUDA杂记--FP16与FP32用途
  • P2392 kkksc03考前临时抱佛脚
  • Linux——线程互斥
  • 【RHCSA 问答题】第 13 章 访问 Linux 文件系统
  • PYTHON从入门到实践-16数据视图化展示
  • 卫星通信终端天线对星之:参考星对星
  • DOM元素添加技巧全解析
  • 单片机CPU内部的定时器——滴答定时器
  • Linux DNS 服务器正反向解析