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

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.xdnf.cn/news/16281.html

相关文章:

  • ​机器学习从入门到实践:算法、特征工程与模型评估详解
  • 计算机中的单位(详细易懂)
  • 关于数据库表id自增问题
  • MySQL存储引擎深度解析与实战指南
  • 告别虚函数性能焦虑:深入剖析C++多态的现代设计模式
  • 数组相关学习
  • 基于深度学习的胸部 X 光图像肺炎分类系统(五)
  • 解决笔记本合盖开盖DPI缩放大小变 (异于网传方法,Win11 24H2)
  • 20分钟学会TypeScript
  • 若依框架 ---一套快速开发平台
  • 从零本地部署使用Qwen3-coder进行编程
  • NX848NX854美光固态闪存NX861NX864
  • Dockerfile 文件及指令详解
  • Java面试题及详细答案120道之(001-020)
  • 计算机网络(第八版)— 第2章课后习题参考答案
  • 机器学习中knn的详细知识点
  • 【面试场景题】外卖点餐系统设计思路
  • Flink 自定义类加载器和子优先类加载策略
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 主页-评论用户时间占比环形饼状图实现
  • 编程语言Java——核心技术篇(三)异常处理详解
  • Springboot+activiti启动时报错XMLException: Error reading XML
  • 深度学习day02--神经网络(前三节)
  • Elasticsearch-8.17.0 centos7安装
  • Ubuntu 环境下创建并启动一个 MediaMTX 的 systemd 服务
  • 栈与队列:数据结构核心解密
  • 链表反转算法详解
  • Fluent自动化仿真(TUI命令脚本教程)
  • springboot(3.4.8)整合mybatis
  • 【图像理解进阶】如何对图像中的小区域进行细粒度的语义分割?
  • WAIC2025预告|英码深元AI一体机将亮相华为昇腾展区,以灵活部署的能力赋能行业智能化转型