本文档讲述内容与代码示例可参见 Shoulder-Demo2 |
能力激活方式:
<dependency>
<groupId>cn.itlym</groupId>
<artifactId>shoulder-starter-mysql</artifactId>
<version>0.8.1<version>
</dependency>
compile 'cn.itlym:shoulder-starter-mysql:0.8.1'
高性能序号生成器 Sequence
基于 DB 的序列生成器,可使用 SequenceGenerator#next(mySequenceName)
获取 mySequenceName 序列的下一个序列号。
// fold:on
public class SequenceDemo {
@Autowired
private SequenceGenerator sequenceGenerator;
public void testSequence() {
// fold:off
// 获取下一个序列号
long next = sequenceGenerator.next("mySequenceName");
// fold:on
}
}
// fold:off
Sequence 组件需要在数据源配置好,且数据库表结构已创建的前提下使用,否则会抛出异常。 |
表的创建语句如下:
CREATE TABLE IF NOT EXISTS tb_sequence
(
name varchar(64) comment '主键:序列号名(业务标记)' primary key,
min_value int default 0 not null comment '最小值:达到最大值后会重置为min_value作为初始值',
max_value int default not null comment '最大值:序号不会比该值更大,达到后将重置',
step int not null comment 'step',
current_value int not null comment 'current_value',
create_time datetime default CURRENT_TIMESTAMP null comment '创建时间',
update_time datetime default CURRENT_TIMESTAMP null comment '最后修改时间',
description varchar(255) null comment '用户描述'
)
comment 'sequence';
Sequence 设计中使用了双 Buffer 缓冲,设计时考虑了更多的异常场景,充分保证了高并发同时避免了并发下出现重复的序列号问题。 |
业务流水号生成器
用于生成全局趋势递增的 id,可作为数据库的索引键,同时允许扩展 id 生成规则。
默认不依赖DB,当 sequence 组件被激活后,则底层优先使用 sequence
|
id 生成工具类 IdGenerationUtil
Shoulder
内置了一些列 id 生成算法,只填写对应参数即可生成合法 id,您还可以自行扩展。
若您希望生成如下格式id 日期(8)+数据版本位(1)+区域位(1)+sequence(8)
/**
* 简单ID生成:适用于非关键流水ID,如一些后台系统,配置表的主键
* <p>
* 格式:日期(8)+数据版本位(1)+区域位(1)+sequence(8)
*
* @param now 当前时间,必填
* @param dataVersion 非必填,默认是1
* @param seq sequence,必填,标准长度是8位,超过8位截取后八位,不足八位前面补齐0
* @return id 流水号ID
*/
public static String generateId(Date now, String dataVersion, long seq) {
return standardizeDate(now)
+ standardizeDataVersion(dataVersion)
+ getCurrentRegionCode()
+ standardizeSequence(seq);
}
数据库 id 生成器 EntityIdGenerator
Shoulder
定义了实体 id 生成器,并提供了两个默认实现
-
SequenceEntityIdGenerator
借助shoulder-data
SequenceGenerator
生成,每个实体类递增器不同【连接数据库后优先使用该策略】 -
DefaultEntityIdGenerator
借助shoulder-core
GuidGenerator
生成,全局使用相同递增器【未连接数据库时兜底使用该策略】
业务号生成器 BizIdGenerator
【Developing】
bizId
-
是指有业务含义的 id,在成熟的系统设计中通常与数据库记录的主键不是同一个字段,
主键 id
通常是全局唯一且自增且仅内部使用,业务流水号 bizId
除了全局唯一一般还具有业务含义且允许对系统外部暴露,如购物网站中的用户订单号。
业务号生成器是为 bizId
字段自动填充值,无需编码,Shoulder
内置了以下策略:
-
ReuseIdBizIdGenerator
,与id
值相同 -
KeyFieldsBizIdGenerator
,在Entity
中,为部分字段添加注解,将会自动根据这些字段生成唯一 hash,作为 bizId -
SequenceBizIdGenerator
,借助SequenceGenerator
生成 id -
ConditionalBizIdGenerator
,接口,您可以自行实现该接口来定制您的bizId
生成规则。
增强的 Mybatis-Plus
Shoulder
在 Mybatis-Plus
之上为您实现了 安全模糊匹配
、DB禁写
、SQL性能监控
、高级分页
、乐观锁
、租户
、bizId
等高级功能,且支持通过配置激活、改造、扩展他们。
支持自动填充 id
、bizId
、version
结合 Shoulder
的 sequence
,实现一些字段的自动设置,无需手动编码。
考虑高频场景,Shoulder
提供了 Entity
模板类:BaseEntity
、LogicDeleteEntity
、BizEntity
、BizTreeEntity
,方便在基础字段统一,大幅降低维护成本,并为通用字段统一管理提供可能。
更多默认方法
您可以在您的 Mapper 中定义这些方法直接使用而不需要在 xml
中写 SQL
。
-
基础扩展
-
DeleteInLogicById
-
DeleteInLogicByIdList
-
SelectForUpdateById
-
UpdateAllFieldsById
-
InsertBatch
-
-
bizId 相关扩展
-
DeleteInLogicByBizId
-
DeleteInLogicByBizIdList
-
SelectBatchByBizIds
-
SelectBatchForUpdateByBizIds
-
SelectBatchForUpdateByIds
-
SelectByBizId
-
SelectForUpdateByBizId
-
UpdateByBizId
-
极速开发:模板类
层级 | Shoulder 对应类 | Mybatis-Plus 对应类 | 增强说明 |
---|---|---|---|
Entity 层 |
|
- |
在基础字段统一,大幅降低维护成本,并为通用字段统一管理提供可能。更多: |
Mapper 层 |
|
|
新增了 Shoulder-Mybatis-plus 增强-更多默认方法 中支持的方法,允许用户直接使用,无需编写 |
Service 接口层 |
|
|
TODO,更强大的缓存能力增强参见: |
Service 实现层 |
|
|
TODO |
接口层 |
|
- |
定义了基础的方法,更多增强, |
接口实现层 |
|
- |
TODO,更强大的缓存能力增强参见: |
基于 Shoulder
的这些全自动能力,你甚至只需要定义表结构,就能生成完整的 Restful
风格 “增删改查” HTTP 接口,可轻松衍生低代码产品。