MyBatis-Plus速成指南:常用注解

news2025/2/5 13:25:18

@Table Name:

  1. 概述:
    1. MyBatis-Plus 在确定操作的表时,由 BaseMapper的泛型决定,即实体类决定,且默认操作的表名和实体类的类名一致
  2. 问题:
    1. 如果实体类类型的类名和要操作表的表名不一致会出现什么问题?(把 user 表改成 t_user)
      1. 答:程序抛出异常,Table 'mybatis_plus,.user' doesn't exist,因为现在的表名 t_user,而默认的表名和实体类型的类名一致,即 user表:
  3. 通过 @TableName 解决问题:
    1. 在实体类类型上添加 @TableName("t_user"),表示实体类对应的表,即可成功执行 SQL 语句
  4. 通过全局配置解决问题:
    1. 在开发过程中,我们经常遇到以上问题,即实体类所对应的表都有固定的前缀,例如 t_ 或 tbl_
    2. 此时,可以使用 MyBatis-Plus 提供的全局配置,为实体类所对应的表名设置默认的前缀,那么就不需要在每个实体类上通过 @TableName 标识实体类对应的表

@TableId:

  1. 概述:
    1. 经过以上的测试,MyBatis-Plus 在实现 CURD 时,会默认将 id 作为主键列,并在插入数据时,默认基于雪花算法的策略生成的 id
  2. 问题:
    1. 若实体类和表中标识主键的不是 id,而是其他字段,例如 uid,MyBatis-Plus 会自动识别 uid 作为主键列吗?
      1. 答:程序抛出异常 Field 'u_id' doesn't have a default value ,说明 MyBatis-Plus 没有将 uid 作为主键赋值
  3. 通过 @TableId 解决问题:
    1. 在实体类中 uid 属性上通过 @TableId 将其标识为主键,即可成功执行 SQL 语句

@TableId 的 value 属性:

  1. 若实体类中主键对应的属性为 id,而表中表示主键的字段为 uid,此时若只在属性 id 上添加注解 @TableId,则抛出异常 Unknown column 'id' in 'field list',即 MyBatis-Plus 仍然会将 id 最为表的主键操作,而表中表示主键的字段是 uid
  2. 此时需要通过 @TableId 注解的 value 属性,指定表中的主键字段,@TableId("uid") 或 @TableId(value = "uid")

@TableId 的 type 属性:

  1. type 属性用来定义主键策略:
  2. 常用的主键策略:

    描述

    IdType.ASSIGN_ID(默认)

    基于雪花算法的策略生成的数据 id,与数据库 id 是否设置自增无关

    IdType.AUTO

    使用数据库的自增策略,注意,该类型请确保数据库设置了 id 自增,否则无效

  3. 配置全局主键策略:

雪花算法:

  1. 背景:
    1. 选择合适的方案去对应数据规模的增长,以应对逐渐增长的访问压力和数据量
    2. 数据库的扩展方式主要包括:业务分库、主从复制、数据库分表
  2. 数据库分表:
    1. 将不同业务数据分散存储到不同的数据库服务器,能够支撑百万甚至千万用户规模的业务,但如果业务继续发展,同意业务的单表数据会达到单台服务器的处理瓶颈
      1. 例如:淘宝的几亿用户数据,如果全部存放在一台数据库服务的一张表中,肯定是无法满足性能要求得,此时就需要对表单数据进行拆分
    2. 单表数据拆分由两种方式:垂直分表和水平分表。示意图如下:
  3. 垂直分表:
    1. 垂直分表适合将表中某些不常用且占了大量空间的列拆分出去
    2. 例如:前面示意图中的 nickname 和 desription 字段,假设我们是一个婚恋网站,用户在筛选其他用户的时候,主要使用 age 和 sex 两个字段,进行查询,而 nickname 和 decription 两个字段单独存储到另外一张表中,这样在查询 age 和 sex 时,就能带来一定的性能提升
  4. 水平分表:
    1. 水平分表适合表行数特别大的表,又得公司要求单表行数超过 5000 万就必须进行分表,可能超过 1000 万就要分表了
    2. 而对于一些简单的表,及时存储数据超过一亿行,也可以不分表
    3. 但不管怎样,当看到表的数据量达到千万级别时,作为架构师就要警觉起来,因为这很有可能是架构的性能瓶颈或者隐患
  5. 两者区别:
    1. 水平分表比垂直分表会引入更多的复杂问题
    2. 例如:要求全局唯一的数据 id 该如何处理

水平分表:

  1. 主键自增:
    1. 以最常见的用户 ID 为例:可以按照 1000000 的范围大小进行分段,1 ~ 999999 放到表 1 中,1000000 ~ 1999999 放到表 2 中,以此类推
    2. 复杂点:
      1. 分段大小的选取。
      2. 分段太小会导致切分后子表数量过多,增加维护复杂度
      3. 分段太大可能导致单表依然存在性能问题,一般建议分段大小在 100 万至 200 万之间,具体需要根据业务选取合适的分段大小
    3. 优点:
      1. 可以随着数据的增加平滑的扩充新的表
      2. 例如:现在的用户是 100 万,如果增加到 1000 万,只需要增加新的表就可以了,原有的数据不需要动
    4. 缺点:
      1. 分布不均匀
      2. 假如:按照 1000万来进行分表,有可能某个分段实际存储的数据量只有 1 条,而另外一个分段实际存储的数据量有 1000 万条
  2. 取模:
    1. 同样以用户 ID 为例,加入我们一开始就规划了 10 个数据库表,可以简单地用 user_id %10 的值来表示数据所属的数据库表编号
    2. 例如:ID 为985 的用户放到编号为 5 的子表中,以此类推
    3. 优点:表分布比较均匀
    4. 缺点:扩充新的表很麻烦,所有数据都要重分布
  3. 雪花算法:
    1. 雪花算法是由 Twitter 公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同的主键有序性
    2. 核心思想:
      1. 长度共 64 bit(一个 long 类型)
      2. 首先是一个符号位,1 bit 表示,由于 long 基本类型在 Java 中是带符号的,最高位是符号位(整数是0,负数是1),所以 id 一般是正数,最高位是 0
    3. 41 bit 时间戳(毫秒级),存储的是时间戳的差值(当前时间 - 开始时间),结果等于 69.73 年
    4. 10 bit 作为机器的 ID:5 个 bit 是数据中心,5 个 bit 的机器 ID,可以部署在 1024 个节点
    5. 12 bit 作为毫秒内的流水号:意味着每个节点在每毫秒可以产生 4096 个 ID
    6. 优点:整体上按照时间自增排序,并且整个分布式系统内不会产生 ID 碰撞,并且效率较高

@TableFieId:

  1. 概述:        
    1. 经过以上测试,可以发现:MyBatis-Plus 在执行 SQL 语句时,要保证实体类中的属性名和表中的字段名一致
  2. 问题:如果实体类中的属性名和字段名不一致会出现什么问题?
    1. 情况1:
      1. 若实体类中的属性使用的是驼峰命名风格,而表中的字段使用的是下划线命名风格
      2. 例如:实体类属性 userName,表中字段 user_name
    2. 情况2:
      1. 若实体类中的属性和表中的字段不满足情况1
      2. 例如:实体类属性 name,表中字段 username
      3. 此时需要在实体类属性上使用 @TableFieId("username") 设置属性所对应的字段名

@TableLogic:

  1. 逻辑删除:
    1. 物理删除:真实删除,将对应的数据从数据中删除,之后查询不到此条被删除的数据
    2. 逻辑删除:假删除,将对应数据中代表是否被删除字段的状态改为 " 被删除状态 ",之后在数据库中仍旧能看到此条数据记录
    3. 使用场景:可以进行数据恢复
  2. 实现逻辑删除:
    1. 将数据库中创建逻辑删除状态列,设置默认值为 0
    2. 实体类中添加逻辑删除属性:
    3. 测试:

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

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

相关文章

Linux 压缩打包

Linux压缩打包 文章目录 Linux压缩打包压缩的意义和原理压缩的意义压缩的原理压缩与解压缩的好处 压缩打包命令.zipzip 命令用法unzip 的用法 .gzgzip 的用法gunzip 的用法 .bz2bzip2 的用法bunzip2 的用法 .xzxz 命令用法 tar 04-Linux压缩打包课后习题 压缩的意义和原理 压缩…

RabbitMQ深度探索:前置知识

消息中间件: 消息中间件基于队列模式实现异步 / 同步传输数据作用:可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点: HTTP 请求基于响应的模型,在高并发的情况下,客户端发送大量的请求…

智慧校园平台:构建现代化教育体系的技术支撑

在当今信息技术飞速发展的时代,智慧校园平台成为了现代教育领域中的重要组成部分。智慧校园平台不仅能够提升学校的管理水平,还能提供更为个性化和高效的教学服务,从而促进学生的全面发展。 数据分析是智慧校园平台的重要组成部分。通过对学生…

20250204将Ubuntu22.04的默认Dash的shell脚本更换为bash

20250204将Ubuntu22.04的默认Dash的shell脚本更换为bash 2025/2/4 23:45 百度:dash bash https://blog.csdn.net/2201_75772333/article/details/136955776 【Linux基础】dash和bash简介 Dash(Debian Almquist Shell)和 Bash(Bou…

Golang 并发机制-3:通道(channels)机制详解

并发编程是一种创建性能优化且响应迅速的软件的强大方法。Golang(也称为 Go)通过通道(channels)这一特性,能够可靠且优雅地实现并发通信。本文将揭示通道的概念,解释其在并发编程中的作用,并提供…

可视化大屏在石油方面的应用。

可视化大屏通过整合石油工业全链条数据,构建数字孪生驱动的运营监控体系,显著提升油气勘探、开采、储运及炼化的管理效能。其技术架构依托工业物联网(IIoT)实时采集钻井参数、管道压力、储罐液位等数据,通过OPC UA协议…

【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】从计算机基础到HTML开发:Web开发的第一步

会议官网:www.acvra.org 简介 2025年计算机视觉研究进展与应用(ACVRA 2025)将于2025年2月28-3月2日在中国广州召开,将汇聚世界各地的顶尖学者、研究人员和行业专家,聚焦计算机视觉领域的最新研究动态与应用成就。本次…

Axure PR 9 旋转效果 设计交互

大家好,我是大明同学。 这期内容,我们将学习Axure中的旋转效果设计与交互技巧。 旋转 创建旋转效果所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个按钮元件。 创建交互 创建按钮交互状态 1.选中按钮元件&#xf…

Docker 部署教程jenkins

Docker 部署 jenkins 教程 Jenkins 官方网站 Jenkins 是一个开源的自动化服务器,主要用于持续集成(CI)和持续交付(CD)过程。它帮助开发人员自动化构建、测试和部署应用程序,显著提高软件开发的效率和质量…

计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战

前一篇文章,Tensor 基本操作5 device 管理,使用 GPU 设备 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started PyTorch 计算图和 Autograd 微积分之于机器学习Computational Graphs 计算图Autograd…

接入DeepSeek大模型

接入DeepSeek 下载并安装Ollamachatbox 软件配置大模型 下载并安装Ollama 下载并安装Ollama, 使用参数ollama -v查看是否安装成功。 输入命令ollama list, 可以看到已经存在4个目录了。 输入命令ollama pull deepseek-r1:1.5b, 下载deepse…

【论文复现】粘菌算法在最优经济排放调度中的发展与应用

目录 1.摘要2.黏菌算法SMA原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 本文提出了一种改进粘菌算法(ISMA),并将其应用于考虑阀点效应的单目标和双目标经济与排放调度(EED)问题。为提升传统粘菌算法&#xf…

UE Bridge混合材质工具

打开虚幻内置Bridge 随便点个材质点右下角图标 就能打开材质混合工具 可以用来做顶点绘制

基于 yolov8_pyqt5 自适应界面设计的火灾检测系统 demo:毕业设计参考

基于 yolov8_pyqt5 自适应界面设计的火灾检测系统 demo:毕业设计参考 【毕业设计参考】基于yolov8-pyqt5自适应界面设计的火灾检测系统demo.zip资源-CSDN文库 【毕业设计参考】基于yolov8-pyqt5自适应界面设计的火灾检测系统demo.zip资源-CSDN文库 一、项目背景 …

Linux 传输层协议 UDP 和 TCP

UDP 协议 UDP 协议端格式 16 位 UDP 长度, 表示整个数据报(UDP 首部UDP 数据)的最大长度如果校验和出错, 就会直接丢弃 UDP 的特点 UDP 传输的过程类似于寄信 . 无连接: 知道对端的 IP 和端口号就直接进行传输, 不需要建立连接不可靠: 没有确认机制, 没有重传机制; 如果因…

chrome浏览器chromedriver下载

chromedriver 下载地址 https://googlechromelabs.github.io/chrome-for-testing/ 上面的链接有和当前发布的chrome浏览器版本相近的chromedriver 实际使用感受 chrome浏览器会自动更新,可以去下载最新的chromedriver使用,自动化中使用新的chromedr…

第一个Qt开发实例(一个Push Button按钮和两个Label)【包括如何在QtCreator中创建新工程、代码详解、编译、环境变量配置、测试程序运行等】

目录 Qt开发环境QtCreator的安装、配置在QtCreator中创建新工程在Forms→mainwindow.ui中拖曳出我们要的图形按钮查看拖曳出按钮后的代码为pushButton这个图形添加回调函数编译工程关闭开发板上QT的GUI(选做)禁止LCD黑屏(选做)设置Qt运行的环境变量运行Qt程序如何让程序在系统启…

【react+redux】 react使用redux相关内容

首先说一下,文章中所提及的内容都是我自己的个人理解,是我理逻辑的时候,自我说服的方式,如果有问题有补充欢迎在评论区指出。 一、场景描述 为什么在react里面要使用redux,我的理解是因为想要使组件之间的通信更便捷…

【435. 无重叠区间 中等】

题目: 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 注意 只在一点上接触的区间是 不重叠的。例如 [1, 2] 和 [2, 3] 是不重叠的。 示例 1: 输入: intervals …

文献学习笔记:中风醒脑液(FYTF-919)临床试验解读:有效还是无效?

【中风醒脑液(FYTF-919)临床试验解读:有效还是无效?】 在发表于 The Lancet (2024 年 11 月 30 日,第 404 卷)的临床研究《Traditional Chinese medicine FYTF-919 (Zhongfeng Xingnao oral pr…