常用注解
@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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战