使用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(活动记录)

领域模型这个概念很好理解,就是我关心我涉及的这片领域,也就是说,我一个实体只管我涉及的表的增删改查。

使用上来讲特别的方便,

 

posted @ 2021-11-10 15:51  蔡徐坤1987  阅读(3198)  评论(0编辑  收藏  举报