1.登錄可自帶數據隔離,其中 tenant_id 為隔離字段,在需要隔離的數據庫表里定義,但是不能在代碼里寫 setTenantId(xxx)這樣的東西,這樣會讓你的sql列重復!
但是有些場景在保存時候,不需要tenant_id ,這種表需要加載 IGNORE_TENANT_TABLES 里
2.加載完配置類
globalConfig.setMetaObjectHandler(new MetaHandler()); 開啟自動填充,可對一些通用字段例如 createtime updateTime creator 自動填入數據

實現方式:
import com.baomidou.mybatisplus.core.config.GlobalConfig; import com.baomidou.mybatisplus.core.parser.ISqlParser; import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler; import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser; import com.foton.framework.util.LoginUtil; import com.google.common.collect.Lists; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.StringValue; import org.apache.commons.lang3.StringUtils; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.List; /** * MybatisPlus配置 */ @Configuration @MapperScan({ "com.foton.**.mapper"}) public class MybatisPlusConfig { /** * mybatios-plus樂觀鎖插件 * * @return */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } private static final String SYSTEM_TENANT_ID = "tenant_id"; //忽略的表 private static final List<String> IGNORE_TENANT_TABLES = Lists.newArrayList("dictionary", "sys_login_log","sys_operation_log","scheduled_record", "notice","notice_read_history","oil_record"); /** * 租戶數據隔離 * * 在mapper 方法上添加 @SqlParser(filter = true) 可以忽略攔截 * @return */ @Bean public PaginationInterceptor paginationInterceptor(){ PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); List<ISqlParser> sqlParserList = new ArrayList<>(); TenantSqlParser tenantSqlParser = new TenantSqlParser(); // SQL解析處理攔截:增加租戶處理回調。 tenantSqlParser.setTenantHandler(new TenantHandler() { @Override public Expression getTenantId(boolean where) { String currentTenantId = LoginUtil.getTenantId(); if (StringUtils.isBlank(currentTenantId)) { return new StringValue("getTenantId error."); } return new StringValue(currentTenantId); } @Override public String getTenantIdColumn() { return SYSTEM_TENANT_ID; } @Override public boolean doTableFilter(String tableName) { // 忽略掉一些表:如租戶表(provider)本身不需要執行這樣的處理。 return IGNORE_TENANT_TABLES.stream().anyMatch((e) -> e.equalsIgnoreCase(tableName)); } }); paginationInterceptor.setSqlParserList(Lists.newArrayList(tenantSqlParser)); return paginationInterceptor; } /** * 自動填充功能 * @return */ @Bean public GlobalConfig globalConfig() { GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setMetaObjectHandler(new MetaHandler()); return globalConfig; } }
3.邏輯刪除:
mybatisplus有邏輯刪除的功能,無需寫update方法,修改is_delete字段
實現方式:
直接調用BaseMapper的deleteById就會自動給你update成-1,並且所有查詢方法也將自動加上 is_delete = 0過去掉 邏輯刪除的記錄
4.樂觀鎖:
CAS就是樂觀鎖的一個實現,其實就是每次訪問數據庫的時候,會認為別人不會修改,只需要獲取一下版本號,如果版本號和當前不一致就說明有人修改,就執行失敗了;如果成功了就版本加一
同理mybaits的樂觀鎖也是一樣,通過數據庫里加入version字段,來判斷version來實現樂觀鎖;
/** * version:商品數據版本號. */ private int version;
5.領域模型 Active Record(活動記錄)
領域模型這個概念很好理解,就是我關心我涉及的這片領域,也就是說,我一個實體只管我涉及的表的增刪改查。
使用上來講特別的方便,