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

MyBatis-Plus 实体类注解

MyBatis-Plus 实体类注解详解

MyBatis-Plus 是 MyBatis 的增强版,旨在简化开发者的 CRUD 操作。它通过丰富的特性和注解,简化了数据库与 Java 实体类之间的映射。MyBatis-Plus 提供了一系列的实体类注解,帮助开发者更轻松地映射数据库表、字段,并处理常见的数据操作需求。


1. MyBatis-Plus 实体类注解概览

MyBatis-Plus 提供了一系列注解,用于简化实体类与数据库表之间的映射。常用注解包括:

  • @TableName:指定实体类对应的数据库表名。
  • @TableId:指定主键字段及其生成策略。
  • @TableField:指定非主键字段的映射信息。
  • @TableLogic:用于实现逻辑删除功能。
  • @TableField(fill = ...):用于指定字段的自动填充策略。
  • @Version:用于实现乐观锁。

2. @TableName 注解

@TableName 用于指定实体类对应的数据库表名。如果实体类名与表名不一致,则需要使用该注解进行映射。

使用示例
import com.baomidou.mybatisplus.annotation.TableName;@TableName("user")
public class User {private Integer id;private String username;private String email;
}

在上面的示例中,实体类 User 映射到数据库表 user。如果实体类名和数据库表名相同,则可以省略此注解。

常用属性
  • value:指定表名。
  • schema:指定数据库架构名称(可选)。
  • autoResultMap:是否启用自动结果映射,默认 false
@TableName(value = "user", schema = "mydb", autoResultMap = true)

3. @TableId 注解

@TableId 用于指定表的主键列,并可以设置主键的生成策略。常见的生成策略有自动递增(AUTO)、手动分配(INPUT)等。

使用示例
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;public class User {@TableId(type = IdType.AUTO)private Integer id;private String username;private String email;
}

在上面的示例中,id 字段被标记为主键,并且使用了自动递增策略。

常用属性
  • value:指定主键字段名称。
  • type:指定主键生成策略,常见的生成策略有:
    • IdType.AUTO:数据库自动生成(通常是自增主键)。
    • IdType.INPUT:手动输入主键。
    • IdType.ASSIGN_ID:MyBatis-Plus 自动生成 ID(分布式 ID 算法)。
    • IdType.UUID:生成 UUID 作为主键。
@TableId(value = "user_id", type = IdType.ASSIGN_ID)

4. @TableField 注解

@TableField 用于标注非主键字段的映射。该注解可以配置数据库表中的列名、是否进行自动填充、是否是查询字段等。

使用示例
import com.baomidou.mybatisplus.annotation.TableField;public class User {@TableId(type = IdType.AUTO)private Integer id;@TableField("user_name")private String username;@TableField(exist = false)private String tempField;  // 非数据库字段
}

在上面的示例中,username 字段对应数据库表中的 user_name 列,而 tempField 是一个实体类的临时字段,不会映射到数据库。

常用属性
  • value:指定数据库列名。
  • exist:是否是数据库表中的字段,默认 true。如果设置为 false,表示该字段不参与数据库映射。
  • fill:指定字段的自动填充策略,支持 INSERTUPDATEINSERT_UPDATE
@TableField(value = "created_at", fill = FieldFill.INSERT)

5. @TableLogic 注解

@TableLogic 用于实现逻辑删除功能。逻辑删除是在数据表中不真正删除记录,而是通过标记某个字段(如 is_deleted)来表示数据是否被删除。

使用示例
import com.baomidou.mybatisplus.annotation.TableLogic;public class User {@TableId(type = IdType.AUTO)private Integer id;private String username;@TableLogicprivate Integer isDeleted;
}

在上面的示例中,isDeleted 字段用于标记该记录是否被删除。当使用 MyBatis-Plus 提供的删除方法(如 deleteById)时,实际上会更新 isDeleted 字段的值,而不是物理删除该记录。

默认行为
  • 未删除isDeleted = 0(默认为 0)。
  • 已删除isDeleted = 1(默认为 1)。
自定义逻辑删除值

如果逻辑删除标记的值不为 0 和 1,可以通过全局配置进行自定义。

mybatis-plus:global-config:db-config:logic-not-delete-value: 0  # 未删除的值logic-delete-value: 2      # 已删除的值

6. 自动填充字段 @TableField(fill = ...)

自动填充是指在插入或更新数据时,MyBatis-Plus 自动为某些字段赋值。常见的场景包括:创建时间、更新时间、操作人等。

使用示例
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;import java.time.LocalDateTime;public class User {@TableId(type = IdType.AUTO)private Integer id;@TableField(fill = FieldFill.INSERT)private LocalDateTime createdAt;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updatedAt;
}

在上面的示例中:

  • createdAt 字段会在插入时自动填充。
  • updatedAt 字段会在插入和更新时自动填充。
自动填充实现步骤
  1. 定义实体类字段并加上 @TableField(fill = ...) 注解
  2. 创建自动填充处理器:实现 MetaObjectHandler 接口,重写 insertFillupdateFill 方法。
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createdAt", LocalDateTime::now, LocalDateTime.class);this.strictInsertFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);}
}

7. @Version 乐观锁注解

@Version 注解用于实现乐观锁。在并发环境下,乐观锁可以防止数据的“脏写”,通过版本号(version)字段来保证数据的一致性。

使用示例
import com.baomidou.mybatisplus.annotation.Version;public class User {@TableId(type = IdType.AUTO)private Integer id;private String username;@Versionprivate Integer version;  // 乐观锁版本号
}

当更新 User 表时,MyBatis-Plus 会检查 version 字段。如果版本号匹配,则进行更新,同时版本号自增;否则更新失败,防止数据冲突。


8. 综合示例

以下是一个使用了多种 MyBatis-Plus 注解的完整实体类示例:

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;@Data
@TableName("user")
public class User {@TableId(type = IdType.AUTO)private Integer id;@TableField("user_name")private String username;private String email;@TableLogicprivate Integer isDeleted;@TableField(fill = FieldFill.INSERT)private LocalDateTime createdAt;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updatedAt;@Versionprivate Integer version;
}
  • username 字段映射到数据库的 user_name 列。
  • isDeleted 实现逻辑删除。
  • createdAtupdatedAt 实现自动填充。
  • version 用于实现乐观锁。

9. 总结

MyBatis-Plus 提供的实体类注解极大简化了数据库字段与 Java 类之间的映射和管理,开发者可以通过简单的注解来完成复杂的数据库操作。

  • @TableName:用于映射实体类与数据库表。
  • @TableId@TableField:用于映射主键和普通字段。
  • @TableLogic:实现逻辑删除。
  • @Version:用于乐观锁控制并发修改。
  • 自动填充:通过 @TableField(fill = ...) 配合自定义 MetaObjectHandler 实现创建时间、更新时间等自动填充。

相关文章:

MyBatis-Plus 实体类注解

MyBatis-Plus 实体类注解详解 MyBatis-Plus 是 MyBatis 的增强版,旨在简化开发者的 CRUD 操作。它通过丰富的特性和注解,简化了数据库与 Java 实体类之间的映射。MyBatis-Plus 提供了一系列的实体类注解,帮助开发者更轻松地映射数据库表、字…...

如何写一个自动化Linux脚本去进行等保测试--引言

#我的师兄喜欢给我的休闲实习生活加活,说是让我在实习期间写一个自动化脚本去进行等保测试。呵呵哒。 怎么办呢,师兄的指令得完成,师兄说让我使用Python完成任务。 设想如下: 1、将Linux指令嵌入到python脚本中 2、调试跑通 …...

美团测开OC!

大家好,我是洋子,最近测试社区里面的一个25届同学参加秋招,已经拿到美团测开offer,今天来分享一下他的求职经历,文末附面经 他求职目前的进展如下: 互联网大厂:字节,阿里&#xff…...

HyperWorks的实体几何创建与六面体网格剖分

创建和编辑实体几何 在 HyperMesh 有限元前处理环境中,有许多操作是针对“实体几何”的,例如创建六面体网格。在创建实体网格的工作中,我们既可以使用闭合曲面创建实体网格,也可以使用完整的实体几何创建实体网格。与闭合曲面相比…...

项目实战:Ingress搭建Nginx+WP论坛+MariaDB

1. 网站架构 本次部署形式完全舍弃 Docker,将所有应用都置于Kubernetes,采用 Deployment 而非单 Pod 部署,稳定性得到升级。 2. 部署 MariaDB [rootk8s-master ~]# mkdir tdr [rootk8s-master ~]# cd tdr/ (1)定义 …...

UWA支持鸿蒙HarmonyOS NEXT

华为在开发者大会上,宣布了鸿蒙HarmonyOS NEXT将仅支持鸿蒙内核和鸿蒙系统的应用,不再兼容安卓应用,这意味着它将构建一个全新且完全独立的生态系统。 为此,UWA也将在最新版的UWA SDK v2.5.0中支持鸿蒙HarmonyOS NEXT&#xff0c…...

【齐家网-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...

MyBatis 基本概念

MyBatis 基本概念详解 MyBatis 是一个优秀的持久层框架,它支持定制 SQL、存储过程以及高级映射,用于将 Java 对象与数据库中的记录进行映射。作为 ORM(对象关系映射)框架,MyBatis 的主要优势在于灵活性高,…...

前端开发之装饰器模式

介绍 装饰器模式 是在不修改对象内部结构的情况下,动态地给对象添加功能的一种设计模式。在软件开发中,有时候我们需要为已有对象添加一些额外的行为,但不希望修改该对象的代码,装饰器模式可以很好的满足这一需求。 在TypeScrip…...

【STL】pair 与 map:基础、操作与应用

C 标准库中提供了许多用于处理数据结构的容器和工具。pair 和 map 是两个非常有用的工具,广泛应用于存储和处理关联数据。在本文中,我们将详细介绍 pair 与 map 的相关操作,并结合代码实例为读者提供清晰的理解。 pair:成对数据的…...

深度学习-图像处理篇4VGG网络

CNN感受野...

初级css+初级选择器

一、css基础样式 html: 标签 > 网页骨架 css: 美化这个网页的骨架 >样式去装饰网页 1. css 层叠样式表 (英文全称: Cascading Style Sheets) >修饰网页内容 比如: 文字大小 颜色 网页排版 高宽等等 2. css写在哪里?——行内样式 内部样式 外部样…...

gitlab 的CI/CD (二)

前言 上文完成了gitlab-runner的基础配置及将gitlab的制品上传至软件包库(产品库)的脚本编写; 本文实现gitlab的ci/cd对远程服务器的操作; 介绍 要让Gitlab Runner部署到远程机器,远程机器必须信任gitlab runner账…...

【html】基础(一)

本专栏内容为:前端专栏 记录学习前端,分为若干个子专栏,html js css vue等 💓博主csdn个人主页:小小unicorn ⏩专栏分类:js专栏 🚚代码仓库:小小unicorn的代码仓库🚚 &am…...

【网站架构部署与优化】Nginx优化

文章目录 Nginx服务优化一、隐藏Nginx版本号,避免安全漏洞泄漏方法一:通过修改配置文件方法二:通过修改源码并重新编译安装 修改Nginx的用户和组修改用户与组 配置Nginx网页缓存时间配置Nginx连接保持的超时时间KeepAlive模式简介Nginx中的超…...

gitlab修改访问端口

目录 1.找到gitlab.rb文件,一般在/etc/gitlab/路径下 2.打开配置文件,加上代码 3.重新配置 4.重启gitlab 1.找到gitlab.rb文件,一般在/etc/gitlab/路径下 2.打开配置文件,加上代码 打开文件 sudo vi gitlab.rb 加上默认端口配…...

分库分表-分页排序查询

优质博文:IT-BLOG-CN 背景:我们系统上云后,数据根据用户UDL部分数据在国内,部分数据存储在海外,因此需要考虑分库查询的分页排序问题 一、分库后带来的问题 需求根据订单创单时间进行排序分页查询,在单表…...

【openwrt-21.02】openwrt PPTP Passthrough 不生效问题解决方案

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …...

【编程基础知识】Mysql的各个索引数据结构及其适用场景

一、引言 在数据库的世界中,索引是提升查询速度的超级英雄。就像图书馔的目录帮助我们快速找到书籍一样,MySQL中的索引加速了数据检索的过程。本文将带你深入了解MySQL索引的多种数据结构、它们的适用场景以及如何巧妙地使用它们来优化性能。 二、索引…...

解决IDEA出现:java: 程序包javax.servlet不存在的问题

问题截图: 解决如下: 1. 点击文件——>项目结构 2. 点击库——>点击——>点击java 3. 找到Tomcat的文件夹,找到lib文件夹中的servlet-api.jar,点击确定 4. 选择要添加的模块 5. 点击应用——>确定...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...