常用注解

@TableName

1、表名注解

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

(1)问题:实体类类型的类名,和要操作的表的表名不一致

(2)抛出异常:Table "数据库名.表名' doesn't exist

3、解决

(1)在实体类类型上,添加 @TableName("实体类对应的表名"),标识实体类对应的表

(2)使用 MyBatis-Plus 提供的全局配置,为实体类所对应的表名设置默认的前缀,则不需要在每个实体类上通过 @TableName 标识实体类对应的表

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  #设置MyBatis-Plus全局配置
  global-config:
    db-config:
      #设置实体类所对应的表的统一前缀
      table-prefix: table_
属性 类型 必须指定 默认值 描述
value String "" 表名
schema String "" schema
keepGlobalPrefix boolean false 是否保持使用全局的 tablePrefix 的值(如果设置了全局 tablePrefix 且自行设置了 value 的值)
resultMap String "" xml 中 resultMap 的 id
autoResultMap boolean false 是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建并注入)
excludeProperty String[] {} 需要排除的属性名(@since 3.3.1)

 

@TableId

1、主键注解

属性 类型 必须指定 默认值 描述
value String "" 主键字段名
type Enum IdType.NONE 主键类型

2、MyBatis-Plus 在实现 CRUD 时,默认将 id 作为主键列,并在插入数据时,默认基于雪花算法的策略生成 id

3、问题:表中 id 字段为主键,实体类中表示主键的属性名不为 id

(1)抛出异常:Field '主键字段名' doesn't have a default value

(2)解决:在实体类中,对应主键的属性上,通过 @TableId 将其标识为主键

4、问题:表中主键字段不为 id,实体类中表示主键的属性名为 id

(1)抛出异常:Unknown column 'id' in 'field list'

(2)解决:在实体类中,对应主键的属性上,通过@TableId 的 value 属性,指定表中主键字段,@TableId("主键字段名") 或 @TableId(value="主键字段名")

5、IdType

描述
AUTO 数据库 ID 自增,请确保数据库设置 id 自增,否则无效,针对如 MySQL 支持主键自动递增的数据库
NONE 无状态,表示未设置主键类型,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUT insert 前自行 set 主键值,针对有序列的数据库,如 Oracle,SQLServer 等,当需要建立一个自增字段时,需要用到 sequence
ASSIGN_ID 分配 ID,基于雪花算法的策略生成数据 id,与数据库 id 是否设置自增无关,主键类型:Number(Long 和 Integer)或 String(since 3.3.0),分别对应 MySQL 的表字段为 BIGINT 和 VARCHAR,使用接口 IdentifierGenerator 的方法 nextId(默认实现类:DefaultIdentifierGenerator 雪花算法)
ASSIGN_UUID 分配 UUID,主键类型:String(since 3.3.0),使用接口 IdentifierGenerator 的方法 nextUUID(默认 default 方法)

(1)若设置主键的具体值,则会忽略主键策略

(2)配置全局主键策略

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  #设置MyBatis-Plus的全局配置
  global-config:
    db-config:
      #设置统一的主键生成策略
      id-type: auto

 

背景

1、需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量

2、数据库的扩展方式主要包括:业务分库、主从复制(读写分离),数据库分表

3、数据库分表

(1)将不同业务数据分散存储到不同的数据库服务器,能够支撑百万甚至千万用户规模的业务,但如果业务继续发展,同一业务的单表数据也会达到单台数据库服务器的处理瓶颈

(2)单表数据拆分有两种方式:垂直分表、水平分表

(3)垂直分表:适合将表中某些不常用且占了大量空间的列拆分出去

(4)水平分表:适合表行数特别大的表

4、主键自增

(1)优点:可以随着数据的增加平滑地扩充新的表,原有的数据不需要变动

(2)缺点:表分布不均匀

5、取模

(1)优点:表分布比较均匀

(2)缺点:扩充新的表较难,所有数据都要重分布

 

雪花算法

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)

3、优点:整体上按照时间自增排序,并且整个分布式系统内不会产生 ID 碰撞,并且效率较高

 

@TableField

1、问题:MyBatis-Plus 在执行 SQL 语句时,实体类中的属性名和字段名不一致

2、若实体类中的属性使用驼峰命名风格,表中的字段使用下划线命名风格

(1)此时 MyBatis-Plus 会自动将下划线命名风格转化为驼峰命名风格

(2)等价于在 MyBatis 中配置,且为默认配置

<setting name="mapUnderscoreToCamelCase" value="true"/>

3、若实体类中的属性,和表中的字段,都不按照规定命名

(1)此时需要在实体类属性上,使用 @TableField(""),双引号内设置属性所对应的字段名

 

@TableLogic

1、物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据

2、逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录

(1)使用场景:可以进行数据恢复

3、实现逻辑删除

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

(2)实体类中添加逻辑删除属性,并在该属性上标识 @TableLogic

(3)输入 DELETE 语句,实际执行 UPDATE 语句,将指定记录的逻辑删除状态列,修改为 1

posted @   半条咸鱼  阅读(69)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示