MybatisPlus——常用注解

🚩作者:Philosophy7
⭐内容:介绍MybatisPlus中的常用注解以及❄雪花算法
🌹对小伙伴有帮助的话 请一键三连

一、@TableName

经过上一章的CRUD操作后,我们并没有指明所操作的表,只是在 Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表

由此得出结论,MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决 定,且默认操作的表名和实体类型的类名一致

引入 : 当表名 和 实体类的名称不一致时

可以通过@TableName注解标识实体类对应的表名称
也可以通过全局配置来处理

①@TableName处理问题

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

②配置全局配置

mybatis-plus:
  configuration:
    #设置日志服务
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

  #设置Mybatis-Plus全局配置
  global-config:
    db-config:
      # 设置实体类所对应的表统一前缀
      table-prefix: t_

2、@TableId

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

引入:
若实体类和表中表示主键的不是id 而是其他名称的id 例如: u_id MP会自动识别吗?
实体类中的属性id改为uid 将表中的字段id也改为uid
测试将会抛出SQLException : 原因是 uid字段不是默认主键值 默认的是id

①通过@TableId解决问题

@TableId("uid")
    private Long id;

②详解注解中的value属性

当表中的字段名称和实体类中的属性名称不对应时
我们要声明TableId的value属性
作用是绑定主键的字段

③type属性

type属性用来定义主键策略

常见的主键策略:
描述
IdType.ASSIGN_ID(默 认)基于雪花算法的策略生成数据id,与数据库id是否设置自增无关
IdType.AUTO使用数据库的自增策略,注意,该类型请确保数据库设置了id自增, 否则无效
配置全局主键策略:
mybatis-plus:
  configuration:
    #设置日志服务
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

  #设置Mybatis-Plus全局配置
  global-config:
    db-config:
      # 设置实体类所对应的表统一前缀
      table-prefix: t_
      #设置统一的主键生成策略
      id-type: auto

3、雪花算法

一、背景 :

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

二、数据库分表:

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

三、雪花算法

雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的 主键的有序性。
①核心思想:
长度共64bit(一个long型)。

首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负 数是1,所以id一般是正数,最高位是0。

41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。

10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。

12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。

在这里插入图片描述

4、@TableField

当我们发现实体类中的属性和表中字段不一致情况下,会出现什么问题呢???

  • 情况1: 假设实体类中属性为 : userName 表中字段: user_name
    • 此时MybatisPlus会自动将下划线转换成驼峰命名风格 相当于Mybatis的在全局配置中配置
  • 情况2: 若实体类属性和表中字段不满足上述情况 例如: 实体类属性name 表中字段 username
    • 这个时候就要通过注解@TableField(“username”)设置属性所对应的表字段名。
    @TableField("user_name")
    private String name;

5、@TableLogic

一、逻辑删除

  • 物理删除: 真实删除,删除的记录无法被查询到了。
  • 逻辑删除: 不真实的删除,将被删除的字段标记为"被删除状态",但仍然可以查询的到。
  • 使用场景: 数据恢复

二、实现逻辑删除

  • 第一步:在数据库中创建一个待删除状态列,设置默认值为0

在这里插入图片描述

第二步:实现类添加逻辑删除属性

@TableLogic
    private Integer readyDelete;

第三步:测试

测试删除功能,真正执行的操作是修改

测试查询功能,被逻辑删除的数据默认不会被查询。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Philosophy7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值