spring boot mybatis plus 多租戶與樂觀鎖

我主要配合分表分庫的場景使用spring

多租戶
@Bean
public PaginationInterceptor paginationInterceptor() {
    PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
    List<ISqlParser> sqlParserList = new ArrayList<>();
    TenantSqlParser tenantSqlParser = new TenantSqlParser();
    tenantSqlParser.setTenantHandler(new TenantHandler() {
        @Override
        public Expression getTenantId(boolean where) {
            // 該 where 條件 3.2.0 版本開始添加的,用於分區是否爲在 where 條件中使用
            // 此判斷用於支持返回多個租戶 ID 場景,具體使用查看示例工程
            return new LongValue(1L); ///  多租戶的字段值,能夠從緩存獲取
        }sql

        @Override
        public String getTenantIdColumn() {
            return "tenant_id"; // 多租戶的列名
        }緩存

        @Override
        public boolean doTableFilter(String tableName) {
            // 這裏能夠判斷是否過濾表
            /*
            if ("user".equals(tableName)) {// 根據表名判斷是否過濾,true 排除解析
                return true;
            }*/
            return false;
        }
    });
    sqlParserList.add(tenantSqlParser);
    paginationInterceptor.setSqlParserList(sqlParserList);
    paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
        @Override
        public boolean doFilter(MetaObject metaObject) {
            MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
            // 過濾自定義查詢此時無租戶信息約束【 麻花藤 】出現
            if ("com.baomidou.springboot.mapper.UserMapper.selectListBySQL".equals(ms.getId())) {// 根據方法名判斷是否過濾,true 排除解析
                return true;
            }
            return false;
        }
    });
    return paginationInterceptor;
}springboot

多租戶在單表查詢下會自動帶上多租戶的列名與多租戶的字段值,在分表分庫的狀況下與shareding 配合使用能夠簡化流程app

樂觀鎖ide

@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
    return new OptimisticLockerInterceptor();
}.net

2.註解實體字段 @Version 必需要!
@Version
private Integer version;get


支持的數據類型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
整數類型下 newVersion = oldVersion + 1
newVersion 會回寫到 entity 中
僅支持 updateById(id) 與 update(entity, wrapper) 方法
在 update(entity, wrapper) 方法下, wrapper 不能複用!!!it

int id = 100;
int version = 2;io

User u = new User();
u.setId(id);
u.setVersion(version);
u.setXXX(xxx);

if(userService.updateById(u)){
    System.out.println("Update successfully");
}else{
    System.out.println("Update failed due to modified by others");
}


update tbl_user set name = 'update',version = 3 where id = 100 and version = 2

多租戶與樂觀鎖根據本身的業務場景能夠配合分表分庫使用,重構攔截器調整

相關文章
相關標籤/搜索