一、@TableName(value = “if_user”) 或 @TableName(“if_user”)
@TableName注解主要是实现实体类型和数据库中的表实现映射。
二、@TableId
默认情况下数据库的id列使用的是基于雪花算法的策略生成。
背景
数据库的扩展方式主要包括:业务分库、主从复制、数据库分表。
2.1、垂直分表
垂直分表适合将表中某些不常用且占了大量空间的列拆分出去。 例如:一张用户信息表,条件查询常用的年龄、性别 为一张表,另开一张表存储用户其他详细信息,user 用户表、user_info 用户详细信息表,表于表之间为一对一,id相同
2.2、水平分表
适合表数据量较大的表,有的公司规定5000万(参考)就必须进行分表。 水平分表相比垂直分表,复杂性更高,例如id:
2.2.1 主键自增
复杂点:分段大小的选取。 缺点:分布不均匀。
2.2.2 Hash
复杂点:初始表数量的确定。 缺点:扩充新的表很麻烦,所有数据都要重分布。
2.2.3 雪花算法
能够保证不同表的主键的不重复性,以及相同表的主键的有序性。
- 核心思想:
- 长度共64bit(一个long型)。
- 首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。
- 41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。
- 10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。
- 12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。
优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高。
三、指定主键列
原因:因为mybatis-plus默认认为id是主键列,其他名字的属性mybatis-plus无法默认自动填充 解决方案:为主键列添加 @TableId 注解
四、type属性
@TableId(type = IdType.ASSIGN_UUID) 常见以下三种:
- IdType.ASSIGN_ID:使用基于雪花算法的策略生成数据id
- IdType.AUTO:使用数据库的自增策略
- IdType.ASSIGN_UUID:分配UUID
五、@TableField
- 表示子段映射的数据库列名映射:@TableField(“数据库列名”)
- 表示bean字段和数据库无关联:@TableField(exist = false)
- fill属性添加:@TableField(fill = FieldFill.INSERT)
|