!164 fix:插入时逻辑删除正常值初始化错误

Merge pull request !164 from 王帅/main
This commit is contained in:
Michael Yang 2023-07-21 23:29:16 +00:00 committed by Gitee
commit b54b90c85f
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
9 changed files with 62 additions and 39 deletions

View File

@ -20,7 +20,7 @@ public class Account {
@Column(isLogicDelete = true) @Column(isLogicDelete = true)
private Boolean isDelete; private Boolean isDelete;
//Getter Setter... //Getter Setter...
} }
``` ```
@ -33,8 +33,10 @@ accountMapper.deleteById(1);
MyBatis 执行的 SQL 如下: MyBatis 执行的 SQL 如下:
```sql ```sql
UPDATE `tb_account` SET `is_delete` = 1 UPDATE `tb_account`
WHERE `id` = ? AND `is_delete` = 0 SET `is_delete` = 1
WHERE `id` = ?
AND `is_delete` = 0
``` ```
可以看出,当执行 deleteById 时MyBatis 只是进行了 update 操作,而非 delete 操作。 可以看出,当执行 deleteById 时MyBatis 只是进行了 update 操作,而非 delete 操作。
@ -66,10 +68,12 @@ QueryWrapper query1 = QueryWrapper.create()
其执行的 SQL 如下: 其执行的 SQL 如下:
```sql ```sql
SELECT * FROM `tb_account` SELECT *
LEFT JOIN `tb_article` AS `a` ON `tb_account`.`id` = `a`.`account_id` FROM `tb_account`
WHERE `tb_account`.`age` >= 10 LEFT JOIN `tb_article` AS `a` ON `tb_account`.`id` = `a`.`account_id`
AND `tb_account`.`is_delete` = 0 AND `a`.`is_delete` = 0 WHERE `tb_account`.`age` >= 10
AND `tb_account`.`is_delete` = 0
AND `a`.`is_delete` = 0
``` ```
自动添加上 `tb_account.is_delete = 0 AND a.is_delete = 0` 条件。 自动添加上 `tb_account.is_delete = 0 AND a.is_delete = 0` 条件。
@ -90,12 +94,14 @@ WHERE `tb_account`.`age` >= 10
其执行的 SQL 如下: 其执行的 SQL 如下:
```sql ```sql
SELECT * FROM `tb_account` SELECT *
LEFT JOIN ( FROM `tb_account`
SELECT * FROM `tb_article` WHERE `id` >= 100 AND `is_delete` = 0 LEFT JOIN (SELECT *
) AS `a` FROM `tb_article`
ON `tb_account`.`id` = a.id WHERE `id` >= 100 AND `is_delete` = 0) AS `a`
WHERE `tb_account`.`age` >= 10 AND `tb_account`.`is_delete` = 0 ON `tb_account`.`id` = a.id
WHERE `tb_account`.`age` >= 10
AND `tb_account`.`is_delete` = 0
``` ```
@ -179,7 +185,7 @@ public interface LogicDeleteProcessor {
} }
``` ```
具体实现可以参考:[DefaultLogicDeleteProcessorImpl](https://gitee.com/mybatis-flex/mybatis-flex/blob/main/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/DefaultLogicDeleteProcessorImpl.java) 具体实现可以参考:[DefaultLogicDeleteProcessor](https://gitee.com/mybatis-flex/mybatis-flex/blob/main/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/DefaultLogicDeleteProcessor.java)
## SpringBoot 支持 ## SpringBoot 支持
@ -195,6 +201,6 @@ public class MyConfiguration {
LogicDeleteProcessor processor = new ....; LogicDeleteProcessor processor = new ....;
return processor; return processor;
} }
} }
``` ```

View File

@ -52,14 +52,14 @@ public abstract class AbstractLogicDeleteProcessor implements LogicDeleteProcess
* *
* @return 未删除标记值 * @return 未删除标记值
*/ */
protected abstract Object getLogicNormalValue(); public abstract Object getLogicNormalValue();
/** /**
* 获取逻辑删除列删除时标记值 * 获取逻辑删除列删除时标记值
* *
* @return 删除时标记值 * @return 删除时标记值
*/ */
protected abstract Object getLogicDeletedValue(); public abstract Object getLogicDeletedValue();
} }

View File

@ -28,7 +28,7 @@ public interface LogicDeleteProcessor {
* 用户构建查询正常数据的条件 * 用户构建查询正常数据的条件
* *
* @param logicColumn 逻辑删除列 * @param logicColumn 逻辑删除列
* @param tableInfo * @param tableInfo 表信息
* @param dialect 数据库方言 * @param dialect 数据库方言
*/ */
String buildLogicNormalCondition(String logicColumn, TableInfo tableInfo, IDialect dialect); String buildLogicNormalCondition(String logicColumn, TableInfo tableInfo, IDialect dialect);
@ -37,7 +37,7 @@ public interface LogicDeleteProcessor {
* 用户与构建删除数据时的内容 * 用户与构建删除数据时的内容
* *
* @param logicColumn 逻辑删除列 * @param logicColumn 逻辑删除列
* @param tableInfo * @param tableInfo 表信息
* @param dialect 数据库方言 * @param dialect 数据库方言
*/ */
String buildLogicDeletedSet(String logicColumn, TableInfo tableInfo, IDialect dialect); String buildLogicDeletedSet(String logicColumn, TableInfo tableInfo, IDialect dialect);
@ -50,6 +50,20 @@ public interface LogicDeleteProcessor {
*/ */
void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo); void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo);
/**
* 获取逻辑删除列未删除标记值
*
* @return 未删除标记值
*/
Object getLogicNormalValue();
/**
* 获取逻辑删除列删除时标记值
*
* @return 删除时标记值
*/
Object getLogicDeletedValue();
} }

View File

@ -30,7 +30,7 @@ public class BooleanLogicDeleteProcessor extends AbstractLogicDeleteProcessor {
* 逻辑删除字段值为 {@code false} 表示数据未删除 * 逻辑删除字段值为 {@code false} 表示数据未删除
*/ */
@Override @Override
protected Object getLogicNormalValue() { public Object getLogicNormalValue() {
return false; return false;
} }
@ -38,8 +38,8 @@ public class BooleanLogicDeleteProcessor extends AbstractLogicDeleteProcessor {
* 逻辑删除字段值为 {@code true} 表示数据删除 * 逻辑删除字段值为 {@code true} 表示数据删除
*/ */
@Override @Override
protected Object getLogicDeletedValue() { public Object getLogicDeletedValue() {
return true; return true;
} }
} }

View File

@ -45,7 +45,7 @@ public class DateTimeLogicDeleteProcessor extends AbstractLogicDeleteProcessor {
* 逻辑删除字段值为 {@code null} 表示数据未删除 * 逻辑删除字段值为 {@code null} 表示数据未删除
*/ */
@Override @Override
protected Object getLogicNormalValue() { public Object getLogicNormalValue() {
return null; return null;
} }
@ -53,8 +53,8 @@ public class DateTimeLogicDeleteProcessor extends AbstractLogicDeleteProcessor {
* 逻辑删除字段值为 {@code NOW()} 表示数据删除并记录删除时间 * 逻辑删除字段值为 {@code NOW()} 表示数据删除并记录删除时间
*/ */
@Override @Override
protected Object getLogicDeletedValue() { public Object getLogicDeletedValue() {
return "NOW()"; return "NOW()";
} }
} }

View File

@ -37,7 +37,7 @@ public class DefaultLogicDeleteProcessor extends AbstractLogicDeleteProcessor {
@Override @Override
protected Object getLogicNormalValue() { public Object getLogicNormalValue() {
Object normalValueOfLogicDelete = FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete(); Object normalValueOfLogicDelete = FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete();
if (normalValueOfLogicDelete instanceof Number if (normalValueOfLogicDelete instanceof Number
|| normalValueOfLogicDelete instanceof Boolean) { || normalValueOfLogicDelete instanceof Boolean) {
@ -48,7 +48,7 @@ public class DefaultLogicDeleteProcessor extends AbstractLogicDeleteProcessor {
@Override @Override
protected Object getLogicDeletedValue() { public Object getLogicDeletedValue() {
Object deletedValueOfLogicDelete = FlexGlobalConfig.getDefaultConfig().getDeletedValueOfLogicDelete(); Object deletedValueOfLogicDelete = FlexGlobalConfig.getDefaultConfig().getDeletedValueOfLogicDelete();
if (deletedValueOfLogicDelete instanceof Number if (deletedValueOfLogicDelete instanceof Number
|| deletedValueOfLogicDelete instanceof Boolean) { || deletedValueOfLogicDelete instanceof Boolean) {

View File

@ -30,7 +30,7 @@ public class IntegerLogicDeleteProcessor extends AbstractLogicDeleteProcessor {
* 逻辑删除字段值为 {@code 0} 表示数据未删除 * 逻辑删除字段值为 {@code 0} 表示数据未删除
*/ */
@Override @Override
protected Object getLogicNormalValue() { public Object getLogicNormalValue() {
return 0; return 0;
} }
@ -38,8 +38,8 @@ public class IntegerLogicDeleteProcessor extends AbstractLogicDeleteProcessor {
* 逻辑删除字段值为 {@code 1} 表示数据删除 * 逻辑删除字段值为 {@code 1} 表示数据删除
*/ */
@Override @Override
protected Object getLogicDeletedValue() { public Object getLogicDeletedValue() {
return 1; return 1;
} }
} }

View File

@ -30,7 +30,7 @@ public class TimeStampLogicDeleteProcessor extends AbstractLogicDeleteProcessor
* 逻辑删除字段值为 {@code 0} 表示数据未删除 * 逻辑删除字段值为 {@code 0} 表示数据未删除
*/ */
@Override @Override
protected Object getLogicNormalValue() { public Object getLogicNormalValue() {
return 0; return 0;
} }
@ -38,8 +38,8 @@ public class TimeStampLogicDeleteProcessor extends AbstractLogicDeleteProcessor
* 逻辑删除字段值为 {@code NOW()} 表示数据删除并记录删除时时间戳 * 逻辑删除字段值为 {@code NOW()} 表示数据删除并记录删除时时间戳
*/ */
@Override @Override
protected Object getLogicDeletedValue() { public Object getLogicDeletedValue() {
return System.currentTimeMillis(); return System.currentTimeMillis();
} }
} }

View File

@ -1178,12 +1178,15 @@ public class TableInfo {
} }
MetaObject metaObject = EntityMetaObject.forObject(entityObject, reflectorFactory); MetaObject metaObject = EntityMetaObject.forObject(entityObject, reflectorFactory);
Object columnValue = getPropertyValue(metaObject, columnInfoMapping.get(logicDeleteColumn).property); ColumnInfo logicDeleteColumn = columnInfoMapping.get(this.logicDeleteColumn);
Object columnValue = getPropertyValue(metaObject, logicDeleteColumn.property);
if (columnValue == null) { if (columnValue == null) {
String property = columnInfoMapping.get(logicDeleteColumn).property; Object normalValueOfLogicDelete = LogicDeleteManager.getProcessor().getLogicNormalValue();
Class<?> setterType = metaObject.getSetterType(property); if (normalValueOfLogicDelete != null) {
Object normalValueOfLogicDelete = FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete(); String property = logicDeleteColumn.property;
metaObject.setValue(property, ConvertUtil.convert(normalValueOfLogicDelete, setterType)); Class<?> setterType = metaObject.getSetterType(property);
metaObject.setValue(property, ConvertUtil.convert(normalValueOfLogicDelete, setterType));
}
} }
} }