项目中遇到逻辑删除问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目中遇到逻辑删除问题相关的知识,希望对你有一定的参考价值。

参考技术A 系统设置里比如用户、机构管理、字典管理等地方,这里的删除要求逻辑删除,但是这几张表t_user,t_organization,t_dic_type有唯一约束。比如要求机构名唯一,所以逻辑删除了原来数据后,该数据还存在表中,只是status的状态变了,这个时候如果要新增一条同样机构名的数据,会发现新增不进去,因为该表该字段唯一约束了。

这里的解决方法是新建一个org_name和status的唯一约束,当删除的记录的时候,将status的值改为一个唯一值,可以是雪花算法的id,这里因为表里status为int类型,int类型最大值是2147483647,所以雪花算法生成的值明显超过了,所以这里使用[ ”1”+时分秒毫秒 ]作为status的值。

项目中,application.yml中逻辑删除的配置

LogicSqlInjector类中有个方法sqlLogicSet如下:

在启动项目的过程中,会读取表的所有字段,当读取到status字段时,fieldInfo.getLogicDeleteValue()计算的值从application.yml中读取到,即101003。所以只要继承LogicSqlInjector类并重写sqlLogicSet方法,自定义status的值。

如果映射对象相应的字段上@TableLogic注解里没有默认值的话,默认会从application.yml中取101003的值。所以当没有默认值时,重写该方法会对所有表的status都生效,但是有些表的status的值仍然必须为101003,所以有些特别的表需要订制个性规则。比如t_organization表的映射对象Organization,需要在status属性上的@TableLogic注解里设置一个默认值。这里设置为”random”

注意表中set.append(“”); 这里赋的值应该使用sql语言里的语句,如date_format(),random(),这样该值就是动态的。而如果使用DateUtil.getMMTime()则不变。

Organization表中

当设置为random时,再次启动服务的时候,会进到LogicSqlInjector类的sqlLogicSet方法中,在这里作个性化需求。

为什么没有set.append(DateUtil.getMMTime());使用该方法获取的值作为传入status的值呢?因为只启动一次,所以实际操作中,相当于将这个值传入sql中。但是如果使用set.append("date_format(now(),'%k%i%s%f')/1000"),因为是sql的语法,所以值是变化的。

spring boot项目自定义数据源,mybatisplus分页逻辑删除无效解决方法

Spring Boot项目中数据源的配置可以通过两种方式实现:

1.application.yml或者application.properties配置

2.注入DataSource及SqlSessionFactory两个Bean

通过第二种方式配置数据源则按照MybatisPlus官方文档使用分页及逻辑删除插件会无效,解决思路是在初始化SqlSessionFactory将插件设置进去

    /**
     * 逻辑删除插件
     */
    @Bean
    public GlobalConfig globalConfig() {
        GlobalConfig globalConfig = new GlobalConfig();
        GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
        dbConfig.setLogicDeleteValue("Y");
        dbConfig.setLogicNotDeleteValue("N");
        globalConfig.setDbConfig(dbConfig);
        globalConfig.setSqlInjector(new LogicSqlInjector());
        return globalConfig;
    }

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        paginationInterceptor.setDialectType(DbType.MYSQL.getDb());
        return paginationInterceptor;
    }

    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        logger.info("初始化SqlSessionFactory");
        String mapperLocations = "classpath:mybatis/mapper/**/*.xml";
        String configLocation = "classpath:mybatis/mybatis-config.xml";
        MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource()); //数据源
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactory.setMapperLocations(resolver.getResources(mapperLocations));
        sqlSessionFactory.setConfigLocation(resolver.getResource(configLocation));
        sqlSessionFactory.setTypeAliasesPackage("com.innjoy.pms.order.infrastructure.domain.model");
        sqlSessionFactory.setGlobalConfig(globalConfig());
        sqlSessionFactory.setPlugins(new Interceptor[]{paginationInterceptor()});
        return sqlSessionFactory.getObject();
    }

 

以上是关于项目中遇到逻辑删除问题的主要内容,如果未能解决你的问题,请参考以下文章

记录mybatis-plus逻辑删除配置无效的坑

第175天学习打卡(项目 谷粒商城17 API三级分类 删除页面效果 逻辑删除)

第175天学习打卡(项目 谷粒商城17 API三级分类 删除页面效果 逻辑删除)

java中的模糊逻辑

我的卡片查找器遇到了逻辑问题,卡了几天

React Redux:reducers 是不是应该包含任何逻辑