一、逻辑删除配置
<!--定义MyBatisPlus全局策略配置-->
<bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
<property name="dbConfig">
<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig">
<!--实现属性名与数据库表的列名的映射-->
<property name="tableUnderline" value="true"></property>
<!--全局的主键策略-->
<property name="idType" value="AUTO"></property>
<!--全局的表前缀策略配置-->
<property name="tablePrefix" value="tbl_"></property>
<!--全局逻辑删除的实体字段名-->
<property name="logicDeleteField" value="logic_flag"></property>
<!--逻辑已删除值-->
<property name="logicDeleteValue" value="1"></property>
<!--逻辑未删除值-->
<property name="logicNotDeleteValue" value="0"></property>
</bean>
</property>
<!--将自定义的SQL注入器注册到全局-->
<property name="sqlInjector" ref="mySqlInjector"></property>
</bean>
此时数据库logic_flag字段表示是否已经逻辑删除
测试逻辑删除
@Test
public void testLogicDelete(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
EmployeeMapper employeeMapper = context.getBean("employeeMapper",EmployeeMapper.class);
int result = employeeMapper.deleteById(2);
System.out.println("result: " + result);
}
打印日志:
逻辑删除的记录无法进行更新或者查询
二、逻辑删除原理
删除时会判断是否是逻辑删除,如果是sqlMethod
的值为LOGIC_DELETE_BY_ID
,这个方法实际上update
操作
/**
* 根据 ID 删除
*
* @author hubin
* @since 2018-04-06
*/
public class DeleteById extends AbstractMethod {
@Override
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
String sql;
SqlMethod sqlMethod = SqlMethod.LOGIC_DELETE_BY_ID;
if (tableInfo.isWithLogicDelete()) {
sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlLogicSet(tableInfo),
tableInfo.getKeyColumn(), tableInfo.getKeyProperty(),
tableInfo.getLogicDeleteSql(true, true));
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, Object.class);
return addUpdateMappedStatement(mapperClass, modelClass, getMethod(sqlMethod), sqlSource);
} else {
sqlMethod = SqlMethod.DELETE_BY_ID;
sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), tableInfo.getKeyColumn(),
tableInfo.getKeyProperty());
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, Object.class);
return this.addDeleteMappedStatement(mapperClass, getMethod(sqlMethod), sqlSource);
}
}
}
/**
* 逻辑删除
*/
LOGIC_DELETE_BY_ID("deleteById", "根据ID 逻辑删除一条数据", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"),
LOGIC_DELETE_BY_MAP("deleteByMap", "根据columnMap 条件逻辑删除记录", "<script>\nUPDATE %s %s %s\n</script>"),
LOGIC_DELETE("delete", "根据 entity 条件逻辑删除记录", "<script>\nUPDATE %s %s %s %s\n</script>"),
LOGIC_DELETE_BATCH_BY_IDS("deleteBatchIds", "根据ID集合,批量逻辑删除数据", "<script>\nUPDATE %s %s WHERE %s IN (%s) %s\n</script>"),