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

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

@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. 测试:

相关文章:

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

Table Name: 概述: MyBatis-Plus 在确定操作的表时,由 BaseMapper的泛型决定,即实体类决定,且默认操作的表名和实体类的类名一致 问题: 如果实体类类型的类名和要操作表的表名不一致会出现什么问题?(把 us…...

Vue.js组件开发-Vue实现上传word模版打印设置自定义样式和布局

要使用 Vue 实现上传 Word 模板、打印并设置自定义样式和布局,可以借助一些工具和库来完成这个任务。 实现步骤 创建 Vue 项目:使用 Vue CLI 创建一个新的 Vue 项目。安装依赖:安装 docx-templates 库来处理 Word 模板,file-sav…...

Linux 压缩打包

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

RabbitMQ深度探索:前置知识

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

29.日常算法

1. 验证回文串 II 题目来源 给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。 示例 1: 输入: s “aba” 输出: true 示例 2: 输入: s “abca” 输出: true 解释: 可以删除 “c” 字符 或者 “b” …...

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

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

【单层神经网络】基于MXNet的线性回归实现(底层实现)

写在前面 刚开始先从普通的寻优算法开始,熟悉一下学习训练过程下面将使用梯度下降法寻优,但这大概只能是局部最优,它并不是一个十分优秀的寻优算法 整体流程 生成训练数据集(实际工程中,需要从实际对象身上采集数据…...

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)这一特性,能够可靠且优雅地实现并发通信。本文将揭示通道的概念,解释其在并发编程中的作用,并提供…...

Python处理数据库:MySQL与SQLite详解

Python处理数据库:MySQL与SQLite详解 在数据处理和存储方面,数据库扮演着至关重要的角色。Python提供了多种与数据库交互的方式,其中pymysql库用于连接和操作MySQL数据库,而SQLite则是一种轻量级的嵌入式数据库,Pytho…...

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

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

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

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

【 AI agents】letta:2024年代理堆栈演进(中英文翻译)

The AI agents stack AI 代理堆栈 November 14, 2024 11月 14, 2024原文: The AI agents stack官方教程教程学习笔记: 【memgpt】letta 课程1/2:从头实现一个自我编辑、记忆和多步骤推理的代理Understanding the AI agents landscape 了解 AI 代理环境 Although we see a …...

Axure PR 9 旋转效果 设计交互

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

Docker 部署教程jenkins

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

二、CSS笔记

(一)css概述 1、定义 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离。 2、要点 怎么找到标签怎么操作标签对象(element) 3、css的四种引入方式 3.1 行内式 在标签的style属性中设定CSS样式。这种方…...

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

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

基于 Java 开发的 MongoDB 企业级应用全解析

基于Java的MongoDB企业级应用开发实战 目录 背景与历史MongoDB的核心功能与特性企业级业务场景分析MongoDB的优缺点剖析开发环境搭建 5.1 JDK安装与配置5.2 MongoDB安装与集群配置5.3 开发工具选型 Java与MongoDB集成实战 6.1 项目依赖与驱动选择6.2 连接池与客户端配置6.3…...

构建一个测试助手Agent:提升测试效率的实践

在上一篇文章中,我们讨论了如何构建一个运维助手Agent。今天,我想分享另一个实际项目:如何构建一个测试助手Agent。这个项目源于我们一个大型互联网公司的真实需求 - 提升测试效率,保障产品质量。 从测试痛点说起 记得和测试团队讨论时的场景: 小张:每…...

ESXI虚拟机中部署docker会降低服务器性能

在 8 核 16GB 的 ESXi 虚拟机中部署 Docker 的性能影响分析 在 ESXi 虚拟机中运行 Docker 容器时,性能影响主要来自以下几个方面: 虚拟化开销:ESXi 虚拟化层和 Docker 容器化层的叠加。资源竞争:虚拟机与容器之间对 CPU、内存、…...

基于“蘑菇书”的强化学习知识点(五):条件期望

条件期望 摘要一、条件期望的定义二、条件期望的关键性质三、条件期望的直观理解四、条件期望的应用场景五、简单例子离散情况连续情况 摘要 本系列知识点讲解基于蘑菇书EasyRL中的内容进行详细的疑难点分析!具体内容请阅读蘑菇书EasyRL! 对应蘑菇书Eas…...

Linux抢占式内核:技术演进与源码解析

一、引言 Linux内核作为全球广泛使用的开源操作系统核心,其设计和实现一直是计算机科学领域的研究热点。从早期的非抢占式内核到2.6版本引入的抢占式内核,Linux在实时性和响应能力上取得了显著进步。本文将深入探讨Linux抢占式内核的引入背景、技术实现以及与非抢占式内核的…...

接入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…...

SSM开发(十) SSM框架协同工作原理

目录 一、Spring扮演了一个整合者的角色 二、SSM拆解来看 三、SSM框架的核心优势 注: SSM框架(Spring + Spring MVC + MyBatis) 一、Spring扮演了一个整合者的角色 SSM框架中,Spring扮演了一个整合者的角色,它将Spring MVC的Web层和MyBatis的数据持久层连接起来。在SS…...

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 和端口号就直接进行传输, 不需要建立连接不可靠: 没有确认机制, 没有重传机制; 如果因…...

Android开发EventBus

Android开发EventBus 分享一个EventBus 工具类,封装一下,让你少写些代码 直接上代码: public class BaseEventBusUtils {public static void register(Object subscriber) {EventBus eventBus EventBus.getDefault();if (!eventBus.isReg…...

chrome浏览器chromedriver下载

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