使用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(活动记录)
领域模型这个概念很好理解,就是我关心我涉及的这片领域,也就是说,我一个实体只管我涉及的表的增删改查。
使用上来讲特别的方便,