使用mybatisplus踩的幾個坑


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(活動記錄)

領域模型這個概念很好理解,就是我關心我涉及的這片領域,也就是說,我一個實體只管我涉及的表的增刪改查。

使用上來講特別的方便,

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM