MyBatisPlus ---- 常用注解

news2024/9/24 21:22:26

MyBatisPlus ---- 常用注解

  • 1. @TableName
    • a>问题
    • b>通过@TableName解决问题
    • c>通过全局配置解决问题
  • 2. @Tableld
    • a>问题
    • b>通过@TableId解决问题
    • c>@TableId的value属性
    • d>@TableId的type属性
    • e>雪花算法
  • 3. @TableField
    • a>情况1
    • b>情况2
  • 4. @TableLogic
    • a>逻辑删除
    • b>实现逻辑删除

1. @TableName

经过以上的测试,在使用 MyBatis-Plus 实现基本的 CRUD 时,我们并没有指定要操作的表,只是在 Mapper 接口继承 BaseMapper 时,设置了泛型 User,而操作的表为 user 表
由此可以看出,MyBatis-Plus 在确定操作的表时,是由 BaseMapper 的泛型决定的,即实体类决定,且默认操作的表名和实体类型的类名一致

a>问题

若实体类类型的类名和要操作的表的表名不一致,会出现什么问题?
我们将表 user 更名为 t_user,测试插入功能
在这里插入图片描述

程序抛出异常,Table 'mybatis_plus.user' doesn't exist,因为现在的表名为 t_user,而默认操作的表名和实体类类型的类名一致,即 user 表

在这里插入图片描述

b>通过@TableName解决问题

在实体类类型上添加 @TableName(“t_user”),标识实体类对应的表,即可成功执行 SQL 语句

@Data
@TableName("t_user")
public class User {

    private Long id;
    private String name;
    private Integer age;
    private String email;

}

在这里插入图片描述

c>通过全局配置解决问题

在开发的过程中,我们经常遇到以上的问题,即实体类所对应的表都有固定的前缀,例如 t_ 或 tbl_
此时,可以使用 MyBatis-Plus 提供的全局配置,为实体类所对应的表名设置默认的前缀,那么就不需要在每个实体类上通过 @TableName 表示实体类所对应的表

# 配置MyBatis日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      # 配置MyBatis-Plus操作表的默认前缀
      table-prefix: t_

在这里插入图片描述

2. @Tableld

经过以上的测试,MyBatis-Plus 在实现 CRUD 时,会默认将 id 作为主键列,并在插入数据时,默认基于雪花算法的策略生成 id

a>问题

若实体类和表中表示主键的不是 id,而是其他字段,例如 uid,MyBatis-Plus 会自动识别 uid 为主键列吗?
我们将实体类中的属性 id 改为 uid,将表中的字段 id 也改为 uid,测试添加功能
在这里插入图片描述
在这里插入图片描述
程序抛出异常,Field 'uid' doesn't have a default value,说明 MyBatis-Plus 没有将 uid 作为主键赋值

在这里插入图片描述

b>通过@TableId解决问题

在实体类中 uid 属性上通过 @TableId 将其标识为主键,即可成功执行 SQL 语句

@Data
//@TableName("t_user")
public class User {

    @TableId
    private Long uid;
    private String name;
    private Integer age;
    private String email;

}

在这里插入图片描述

c>@TableId的value属性

若实体类中主键对应的属性为 id,而表中表示主键的字段为 uid,此时若只在属性 id 上添加注解 @TableId,则会抛出异常 Unknown column 'id' in 'where clause',即 MyBatis-Plus 任然会将 id 作为表的主键操作,而表中表示主键的是字段 uid

@Data
//@TableName("t_user")
public class User {

    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;

}

此时需要通过 @TableId 注解的 value 属性,指定表中的主键字段,@TableId(“uid”) 或 @TableId(value = “uid”)

@Data
//@TableName("t_user")
public class User {

    @TableId(value = "uid")
    private Long id;
    private String name;
    private Integer age;
    private String email;

}

在这里插入图片描述

d>@TableId的type属性

type 属性用来定义主键策略

在这里插入图片描述

描述
IdType.ASSIGN_ID(默认)基于雪花算法的策略生成数据id,与数据库id是否设置自增无关
IdType.AUTO使用数据库的自增策略,注意,该类型请确保数据库设置了id自增,否则无效

配置全局主键策略

# 配置MyBatis日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      # 配置MyBatis-Plus操作表的默认前缀
      table-prefix: t_
      # 配置MyBatis-Plus的主键自增策略
      id-type: auto

在这里插入图片描述
在这里插入图片描述

e>雪花算法

  • 背景
    需要选择合适方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。
    数据库的扩展方式主要包括:业务分库、主从复制、数据库分表。

  • 数据库分表
    将不同业务数据分散存储到不同的数据库服务器,能够支撑百万甚至千万用户规模的业务,但如果业务继续发展,同一业务的单表数据也会达到单台数据库服务器的处理瓶颈。
    例如:淘宝的几亿用户数据,如果全部存放在一台数据库服务器的一张表中,肯定是无法满足性能要求的,此时就需要对单表数据进行拆分。

单表数据拆分有两种方式:垂直分表和水平分表。
在这里插入图片描述

  • 垂直分表
    垂直分表适合将表中某些不常用且占用了大量空间的列拆分出去。
    例如,前面示意图中的 nickname 和 description 字段,假设我们是一个婚恋网站,用户在筛选其他用户的时候,主要是用 age 和 sex 两个字段进行查询,而 nickname 和 description 两个字段主要用于展示,一般不会再业务查询中用到。description 本身又比较长,因此我们可以将两个字段独立到另外一张表中,这样查询 age 和 sex 时,就能带来一定的性能提升。

  • 水平分表
    水平分表适合表行数特别大的表,有的公司要求单表行数超过 5000 万就必选进行分表,这个数字可以作为参考,但并不是绝对标准,关键还是要看表的访问性能。对于一些比较复杂的表,可能超过 1000 万就要分表了;而对于一些简单的表,即使存储数据超过 1 亿行,也可以不分表。
    但是不管怎样,当看到表的数据量达到千万级别时,作为架构师就要警觉起来,因为这很可能是架构的性能瓶颈或者隐患。
    水平分表相比垂直分表,会引入更多的复杂性,例如要求全局唯一的数据 id 该如何处理

主键自增

(1)以最常见的用户 ID 为例,可以按照 1000000 的范围大小进行分段,1 ~ 999999 放到表 1 中,1000000 ~ 1999999 放到表 2 中,以此类推。
(2)复杂点:分段大小的选取。分段太小会导致切分后子表数量过多,增加维护复杂度;分段太大可能会导致单表依然存在性能问题,一般建议分段大小在 100 万至 2000 万之间,具体需要根据业务选取合适的分段大小。
(3)优点:可以随着数据的增加平滑的扩充新的表。例如:现在的用户时 100 万,如果增加到 1000 万,只需要增加新的表就可以了,原有的数据不需要动。
(4)缺点:分布不均匀。假如按照 1000 万来进行分表,有可能某个分段实际存储的数据量只有 1 条,而另外一个分段实际存储的数据量有 1000 万条。

取模

(1)同样以用户 ID 为例,假如我们一开始就规划了 10 个数据库表,可以简单地用 user_id % 10 的值来表示数据所属的数据库编号,ID 为 985 的用户放到编号为 5 的子表中,ID 为 10086 的用户放到编号为 6 的子表中。
(2)复杂点:初始表数量的确定。表数量太多维护比较麻烦,表数量太少又可能导致单表性能存在问题。
(3)优点:表分布比较均匀。
(4)缺点:扩充新的表很麻烦,所有数据都要重分布。

雪花算法

雪花算法是由 Twitter 公布的分布式主键生成算法,它能保证不同表的主键的不重复性,以及相同表的主键有序性。
(1)核心思想:
长度共 64bit(一个 long 型)。
首先是一个符号位,1bit 表示,由于 long 基本类型在 Java 中是带符号的,最高位是符号位,正数是 0,负数是 1,所以 id 一般是正数,最高位是 0。
41bit 时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于 69.73 年。
10bit 作为机器 ID(5 个 bit 是数据中心,5 个 bit 的机器 ID,可以部署在 1024 个节点)。
12bit 作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。
在这里插入图片描述
(2)优点:整天上按照时间自增排序,且整个分布式系统内不会产生 ID 碰撞,并且效率较高。

3. @TableField

经过以上的测试,我们可以发现,MyBatis-Plus 在执行 SQL 语句时,要保证实体类中的属性名和表中的字段名一致
如果实体类中的属性名和字段名不一致的情况,会出现什么问题呢?

a>情况1

若实体类中的属性使用的是驼峰命名风格,而表中的字段使用的是下划线命名风格
例如实体类属性 userName,表中字段 user_name
此时 MyBatis-Plus 会自动将下划线命名风格转化为驼峰命名风格
相当于在 MyBatis 中配置

b>情况2

若实体类中的属性和表中的字段不满足情况1
例如实体类属性 name,表中字段 username
此时需要在实体类属性上使用 @TableField(“username”) 设置属性所对应的字段名

@Data
//@TableName("t_user")
public class User {

    @TableId(value = "uid")
    private Long id;
    @TableField(value = "username")
    private String name;
    private Integer age;
    private String email;

}

4. @TableLogic

a>逻辑删除

  • 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
  • 逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为“被删除状态”,之后在数据库中依旧能看到此条数据记录
  • 使用场景:可以进行数据恢复

b>实现逻辑删除

step1:数据库中创建逻辑删除状态列,设置默认值为0

在这里插入图片描述

step2:实体类中添加逻辑删除属性

@Data
//@TableName("t_user")
public class User {

    @TableId(value = "uid")
    private Long id;
    @TableField(value = "user_name")
    private String name;
    private Integer age;
    private String email;
    @TableLogic
    private Integer isDeleted;

}

step3:测试
测试删除功能,真正执行的是修改
UPDATE t_user SET is_deleted=1 WHERE uid IN ( ? , ? , ? ) AND is_deleted=0

    @Test
    public void testDeleteBatchIds(){

        //通过多个id批量删除
        //DELETE FROM user WHERE id IN ( ? , ? , ? )
        List<Long> list = Arrays.asList(1L, 2L, 3l);
        int result = userMapper.deleteBatchIds(list);
        System.out.println(result);

    }

在这里插入图片描述

测试查询功能,被逻辑删除的数据默认不会被查询
SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/130268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCodeday03

203.移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1…

基于springboot+mybatis+mysql+html实现医院预约挂号管理系统

基于springbootmybatismysqlhtml实现医院预约挂号管理系统一、系统简介二、系统主要功能界面2.1登陆2.2首页&#xff08;留言板、我的预约&#xff09;--用户2.3就诊预约--用户2.4我的预约--用户2.5我参与的评介--用户2.6我的预约日程--医生2.7对我的评介--医生2.8医生管理--管…

一文探索“预训练”的奥秘!

Datawhale干货 作者&#xff1a;王奥迪&#xff0c;单位&#xff1a;中国移动云能力中心2022年下半年开始&#xff0c;涌现出一大批“大模型”的优秀应用&#xff0c;其中比较出圈的当属AI作画与ChatGPT&#xff0c;刷爆了各类社交平台&#xff0c;其让人惊艳的效果&#xff0c…

[思维模式-19]:《复盘》-7- “积”篇 - 操作复盘- 如何做好复盘

目录 一、联想&#xff1a;复盘的五个误区与七个关键成功要素 1.1 五个误区 1.2 七个关键成功要素 二、复盘的25个“坑”及对策建议 2.1 回顾、评估阶段 2.2 分析、反思阶段 2.3 萃取、提炼阶段 2.4 转化、应用阶段 2.5 复盘引导阶段 三、有效复盘的三项核心技能 3.…

java常见问题处理

文章目录一、前言二、实战演练1、idea常用快捷键使用2、idea设置字体大小3、idea设置背景颜色-背景4、idea配置Maven5、idea中配置JDK6、idea中java.util变红报错IDEA中Sources、JavaDocs路径是红色的7、idea中使用mybatisPlus 自增主键失效&#xff0c;自增主键超大小知识点8、…

ZI-data RO-data RW-data Code BSS DATA

KEIL MDK 查看代码量、RAM使用情况--RO-data、RW-data、ZI-data的解释&#xff08;转&#xff09; - 酒醉的Tiger - 博客园源&#xff1a;KEIL MDK 查看代码量、RAM使用情况--RO-data、RW-data、ZI-data的解释KEIL RVMDK编译后的信息Program Size: Code86496 RO-datahttps://ww…

STM32MP157驱动开发——Linux 音频驱动

STM32MP157驱动开发——Linux 音频驱动一、简介1.CS42L51 简介2.I2S总线3.STM32MP1 SAI 总线接口二、驱动开发1.音频驱动1&#xff09;修改设备树i2c 接口&#xff1a;1.8v电源管理&#xff1a;2&#xff09;SAI 音频接口设备树3&#xff09;sound 节点2.使能和修改内核的 CS42…

linux系统中字符设备驱动开发方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;linux系统中的字符设备驱动实现的基本过程。 目录 第一&#xff1a;字符设备驱动简介 第二&#xff1a;字符设备驱动开发步骤 第三&#xff1a;编写字符设备驱动实验程序 第一&#xff1a;字符设备驱动简介 字符设备是Li…

130道基础OJ编程题之: 58 ~ 67 道

130道基础OJ编程题之: 58 ~ 67 道 文章目录130道基础OJ编程题之: 58 ~ 67 道0. 昔日OJ编程题:58. BC61 金字塔图案59. BC62 翻转金字塔图案60. BC63 菱形图案61. BC64 K形图案62. BC65 箭形图案63. BC66 反斜线形图案64. BC67 正斜线形图案65. BC68 X形图案66. BC69 空心正方形…

电商大促话术

每逢节日&#xff0c;各大电商平台为了迎合节日气氛&#xff0c;会有各种大促活动&#xff0c;客户咨询量都会较平日有所增加&#xff0c;为了接待更多的客户&#xff0c;客服要掌握一定的电商大促话术。 前言 每逢节日&#xff0c;各大电商平台为了迎合节日气氛&#xff0c;会…

Python--数据容器

文章目录一、数据容器数据容器特点对比二、序列三、列表(list)3.1、列表定义&#xff1a;3.2、列表下标索引3.3、列表常用方法&#xff1a;3.4、list遍历四、元组(tuple)4.1、元组定义4.2、元组的常用方法4.3、元组的遍历五、字符串(str)5.1、字符串定义5.2、常用方法5.3、字符…

Unity 3D 资源下载 || Unity 3D 综合案例

Unity 3D 资源下载 你也可以在 Unity 3D 中执行 Window → Asset Store 菜单命令直接访问 Unity 资源商店&#xff08;Asset Store&#xff09;。 Unity 资源商店简介 Unity 资源商店https://www.assetstore.unity3d.com/ 中提供了多种类的游戏媒体资源&#xff08;人物模型…

某微1day后台RCE审计漏洞

某应用存在后台RCE&#xff0c;根据相关信息&#xff0c;我们在对后台审计过程&#xff0c;这里发现一处调用newInstance实例化溯源找到InterfaceRegisterCustomOperationCmd #excute访问路径为 /api/integration/workflowflow/getInterfaceRegisterCustomOperationgetInterfac…

腾讯云域名备案以及ssl证书申请部署springboot

网站备案 1. 先进行网站备案 网站&#xff1a;https://console.cloud.tencent.com/beian 2. 然后在进行公安备案 流程&#xff1a;https://cloud.tencent.com/document/product/243/19142 3. 再在网站中添加备案号 #示例代码如下&#xff1a; <a href"https://b…

计算机网络——ICMP协议

ICMP 支持主机或者服务器实现差错或者异常的探寻。ICMP的功能体现即发送特定的ICMP报文 类型&#xff1a;ICMP属于哪一类的 代码&#xff1a;是为了进一步区分某种类型中不同的情况 检验和&#xff1a;检验整个ICMP报文 ICMP报文 1 终点不可达类型&#xff1a;当路由器或者…

excel超链接应用:快速生成目录的几个方法-上

在平时工作中&#xff0c;为了能快速打开需要的工作表&#xff0c;我们通常会设置一个目录。目录的设置方法有很多种&#xff0c;但大多数人使用的方法还是基本的手动插入超链接的操作。虽然这个方法也行&#xff0c;但是将大大降低你的工作效率&#xff0c;那么今天&#xff0…

【eiseg教程,快速给语义分割任务打标签】

eiseg教程1.安装EISeg2.载入模型权重3.添加类别标签4.设置格式5.标注图片6.部分按键/快捷键eiseg是百度开发的半自动标注工具&#xff0c;可以快速给语义分割任务打标签&#xff0c;提高工作效率。1.安装EISeg &#xff08;1&#xff09;新建一个python3.8的虚拟环境 &#xf…

3D Diffusion模型来了!OpenAI出品,已开源

文&#xff5c;天于刀刀2022年不愧是 AIGC 行业元年。伴随着 ChatGPT 的大火使得谷歌一周之内改口“会认真评估 ChatGPT 对搜索引擎的影响”&#xff0c;OpenAI 在 3D 图像生成领域进一步放出了大招开源项目“Point-E” [1]&#xff0c;可玩程度不下于 ChatGPT&#xff01;简单…

Spring AOP源码探究

1. 前言 Spring除了IOC和DI&#xff0c;还有另一个杀手锏功能——Spring AOP。AOP是一种面向切面的编程思想&#xff0c;它的关注点是横向的&#xff0c;不同于OOP的纵向。面向对象编程时&#xff0c;如果我们要给多个类引入同一个行为&#xff0c;唯一的方式就是使用继承&…

了解SpringBoot自动配置原理

目录 1、SpringBoot特点 1.1、依赖管理 1.1.1 父项目做依赖管理 1.1.2 开发导入starter场景启动器 1.1.3 无需关注版本号&#xff0c;自动仲裁机制 1.1.4 可以修改默认版本号 1.2、自动配置 2、容器功能 2.1、组件添加 1、Configuration 2、Bean、Component、Contro…