项目中遇到逻辑删除问题
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(); }
以上是关于项目中遇到逻辑删除问题的主要内容,如果未能解决你的问题,请参考以下文章
第175天学习打卡(项目 谷粒商城17 API三级分类 删除页面效果 逻辑删除)