本文档讲述内容与代码示例可参见 Shoulder-Demo2

能力激活方式:

Maven
<dependency>
    <groupId>cn.itlym</groupId>
    <artifactId>shoulder-starter-mysql</artifactId>
    <version>0.8.1<version>
</dependency>
Gradle
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 组件需要在数据源配置好,且数据库表结构已创建的前提下使用,否则会抛出异常。

表的创建语句如下:

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)

IdGenerationUtil-示例
    /**
     * 简单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

ShoulderMybatis-Plus 之上为您实现了 安全模糊匹配DB禁写SQL性能监控高级分页乐观锁租户bizId 等高级功能,且支持通过配置激活、改造、扩展他们。

支持自动填充 idbizIdversion

结合 Shouldersequence,实现一些字段的自动设置,无需手动编码。

考虑高频场景,Shoulder 提供了 Entity 模板类:BaseEntityLogicDeleteEntityBizEntityBizTreeEntity,方便在基础字段统一,大幅降低维护成本,并为通用字段统一管理提供可能。

更多默认方法

您可以在您的 Mapper 中定义这些方法直接使用而不需要在 xml 中写 SQL

  • 基础扩展

    • DeleteInLogicById

    • DeleteInLogicByIdList

    • SelectForUpdateById

    • UpdateAllFieldsById

    • InsertBatch

  • bizId 相关扩展

    • DeleteInLogicByBizId

    • DeleteInLogicByBizIdList

    • SelectBatchByBizIds

    • SelectBatchForUpdateByBizIds

    • SelectBatchForUpdateByIds

    • SelectByBizId

    • SelectForUpdateByBizId

    • UpdateByBizId

极速开发:模板类

层级 Shoulder 对应类 Mybatis-Plus 对应类 增强说明

Entity 层

org.shoulder.data.mybatis.template.entity.BaseEntity

-

在基础字段统一,大幅降低维护成本,并为通用字段统一管理提供可能。更多:BaseEntityLogicDeleteEntityBizEntityBizTreeEntity

Mapper 层

org.shoulder.data.mybatis.template.dao.BaseMapper

com.baomidou.mybatisplus.core.mapper.BaseMapper

新增了 Shoulder-Mybatis-plus 增强-更多默认方法 中支持的方法,允许用户直接使用,无需编写 SQL

Service 接口层

org.shoulder.data.mybatis.template.service.BaseService

com.baomidou.mybatisplus.extension.service.IService

TODO,更强大的缓存能力增强参见:org.shoulder.data.mybatis.template.service.BaseCacheableServiceImpl

Service 实现层

org.shoulder.data.mybatis.template.service.BaseServiceImpl

com.baomidou.mybatisplus.extension.service.impl.ServiceImpl

TODO

接口层

org.shoulder.web.template.crud.BaseController

-

定义了基础的方法,更多增强, Restful 风格的增删改查管理接口定义参考:SaveControllerQueryControllerUpdateControllerDeleteController

接口实现层

org.shoulder.web.template.crud.CrudController

-

TODO,更强大的缓存能力增强参见: org.shoulder.web.template.crud.CrudCacheableController

基于 Shoulder 的这些全自动能力,你甚至只需要定义表结构,就能生成完整的 Restful 风格 “增删改查” HTTP 接口,可轻松衍生低代码产品。

安全模糊匹配

避免写 like '%xx%' 等,避免用户输入带来的 SQL注入 问题,您可以使用 .name().last('leftLike' + userInput)

  • fullLike

  • leftLike

  • rightLike

数据权限控制 TODO

根据用户的属性如 组织 角色 当前时间 当前地点 登陆方式 等因素实现更复杂的权限控制 (ABAC)

配置更多拦截器 TODO

相当于默认激活了以下配置

YAML
shoulder:
  web: