diff --git a/docs/zh/core/logic-delete.md b/docs/zh/core/logic-delete.md index 01e51250..a2793b9e 100644 --- a/docs/zh/core/logic-delete.md +++ b/docs/zh/core/logic-delete.md @@ -20,7 +20,7 @@ public class Account { @Column(isLogicDelete = true) private Boolean isDelete; - + //Getter Setter... } ``` @@ -33,8 +33,10 @@ accountMapper.deleteById(1); MyBatis 执行的 SQL 如下: ```sql -UPDATE `tb_account` SET `is_delete` = 1 -WHERE `id` = ? AND `is_delete` = 0 +UPDATE `tb_account` +SET `is_delete` = 1 +WHERE `id` = ? + AND `is_delete` = 0 ``` 可以看出,当执行 deleteById 时,MyBatis 只是进行了 update 操作,而非 delete 操作。 @@ -66,10 +68,12 @@ QueryWrapper query1 = QueryWrapper.create() 其执行的 SQL 如下: ```sql -SELECT * FROM `tb_account` - LEFT JOIN `tb_article` AS `a` ON `tb_account`.`id` = `a`.`account_id` -WHERE `tb_account`.`age` >= 10 - AND `tb_account`.`is_delete` = 0 AND `a`.`is_delete` = 0 +SELECT * +FROM `tb_account` + LEFT JOIN `tb_article` AS `a` ON `tb_account`.`id` = `a`.`account_id` +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` 条件。 @@ -90,12 +94,14 @@ WHERE `tb_account`.`age` >= 10 其执行的 SQL 如下: ```sql -SELECT * FROM `tb_account` - LEFT JOIN ( - SELECT * FROM `tb_article` WHERE `id` >= 100 AND `is_delete` = 0 - ) AS `a` - ON `tb_account`.`id` = a.id -WHERE `tb_account`.`age` >= 10 AND `tb_account`.`is_delete` = 0 +SELECT * +FROM `tb_account` + LEFT JOIN (SELECT * + FROM `tb_article` + WHERE `id` >= 100 AND `is_delete` = 0) AS `a` + 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 支持 @@ -195,6 +201,6 @@ public class MyConfiguration { LogicDeleteProcessor processor = new ....; return processor; } - + } -``` \ No newline at end of file +``` diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/AbstractLogicDeleteProcessor.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/AbstractLogicDeleteProcessor.java index 60dc6904..cc55732a 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/AbstractLogicDeleteProcessor.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/AbstractLogicDeleteProcessor.java @@ -52,14 +52,14 @@ public abstract class AbstractLogicDeleteProcessor implements LogicDeleteProcess * * @return 未删除标记值 */ - protected abstract Object getLogicNormalValue(); + public abstract Object getLogicNormalValue(); /** * 获取逻辑删除列删除时标记值。 * * @return 删除时标记值 */ - protected abstract Object getLogicDeletedValue(); + public abstract Object getLogicDeletedValue(); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/LogicDeleteProcessor.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/LogicDeleteProcessor.java index 8e343786..fc99bd84 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/LogicDeleteProcessor.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/LogicDeleteProcessor.java @@ -28,7 +28,7 @@ public interface LogicDeleteProcessor { * 用户构建查询正常数据的条件。 * * @param logicColumn 逻辑删除列 - * @param tableInfo + * @param tableInfo 表信息 * @param dialect 数据库方言 */ String buildLogicNormalCondition(String logicColumn, TableInfo tableInfo, IDialect dialect); @@ -37,7 +37,7 @@ public interface LogicDeleteProcessor { * 用户与构建删除数据时的内容。 * * @param logicColumn 逻辑删除列 - * @param tableInfo + * @param tableInfo 表信息 * @param dialect 数据库方言 */ String buildLogicDeletedSet(String logicColumn, TableInfo tableInfo, IDialect dialect); @@ -50,6 +50,20 @@ public interface LogicDeleteProcessor { */ void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo); + /** + * 获取逻辑删除列未删除标记值。 + * + * @return 未删除标记值 + */ + Object getLogicNormalValue(); + + /** + * 获取逻辑删除列删除时标记值。 + * + * @return 删除时标记值 + */ + Object getLogicDeletedValue(); + } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/BooleanLogicDeleteProcessor.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/BooleanLogicDeleteProcessor.java index cc8e1017..87b90c44 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/BooleanLogicDeleteProcessor.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/BooleanLogicDeleteProcessor.java @@ -30,7 +30,7 @@ public class BooleanLogicDeleteProcessor extends AbstractLogicDeleteProcessor { * 逻辑删除字段值为 {@code false} 表示数据未删除。 */ @Override - protected Object getLogicNormalValue() { + public Object getLogicNormalValue() { return false; } @@ -38,8 +38,8 @@ public class BooleanLogicDeleteProcessor extends AbstractLogicDeleteProcessor { * 逻辑删除字段值为 {@code true} 表示数据删除。 */ @Override - protected Object getLogicDeletedValue() { + public Object getLogicDeletedValue() { return true; } -} \ No newline at end of file +} diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/DateTimeLogicDeleteProcessor.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/DateTimeLogicDeleteProcessor.java index 1f842be0..beedb5e0 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/DateTimeLogicDeleteProcessor.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/DateTimeLogicDeleteProcessor.java @@ -45,7 +45,7 @@ public class DateTimeLogicDeleteProcessor extends AbstractLogicDeleteProcessor { * 逻辑删除字段值为 {@code null} 表示数据未删除。 */ @Override - protected Object getLogicNormalValue() { + public Object getLogicNormalValue() { return null; } @@ -53,8 +53,8 @@ public class DateTimeLogicDeleteProcessor extends AbstractLogicDeleteProcessor { * 逻辑删除字段值为 {@code NOW()} 表示数据删除,并记录删除时间。 */ @Override - protected Object getLogicDeletedValue() { + public Object getLogicDeletedValue() { return "NOW()"; } -} \ No newline at end of file +} diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/DefaultLogicDeleteProcessor.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/DefaultLogicDeleteProcessor.java index 33ea24ef..19566fdb 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/DefaultLogicDeleteProcessor.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/DefaultLogicDeleteProcessor.java @@ -37,7 +37,7 @@ public class DefaultLogicDeleteProcessor extends AbstractLogicDeleteProcessor { @Override - protected Object getLogicNormalValue() { + public Object getLogicNormalValue() { Object normalValueOfLogicDelete = FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete(); if (normalValueOfLogicDelete instanceof Number || normalValueOfLogicDelete instanceof Boolean) { @@ -48,7 +48,7 @@ public class DefaultLogicDeleteProcessor extends AbstractLogicDeleteProcessor { @Override - protected Object getLogicDeletedValue() { + public Object getLogicDeletedValue() { Object deletedValueOfLogicDelete = FlexGlobalConfig.getDefaultConfig().getDeletedValueOfLogicDelete(); if (deletedValueOfLogicDelete instanceof Number || deletedValueOfLogicDelete instanceof Boolean) { diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/IntegerLogicDeleteProcessor.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/IntegerLogicDeleteProcessor.java index be981042..e92345ae 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/IntegerLogicDeleteProcessor.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/IntegerLogicDeleteProcessor.java @@ -30,7 +30,7 @@ public class IntegerLogicDeleteProcessor extends AbstractLogicDeleteProcessor { * 逻辑删除字段值为 {@code 0} 表示数据未删除。 */ @Override - protected Object getLogicNormalValue() { + public Object getLogicNormalValue() { return 0; } @@ -38,8 +38,8 @@ public class IntegerLogicDeleteProcessor extends AbstractLogicDeleteProcessor { * 逻辑删除字段值为 {@code 1} 表示数据删除。 */ @Override - protected Object getLogicDeletedValue() { + public Object getLogicDeletedValue() { return 1; } -} \ No newline at end of file +} diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/TimeStampLogicDeleteProcessor.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/TimeStampLogicDeleteProcessor.java index 8cd2f6f2..61d4d8a4 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/TimeStampLogicDeleteProcessor.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/impl/TimeStampLogicDeleteProcessor.java @@ -30,7 +30,7 @@ public class TimeStampLogicDeleteProcessor extends AbstractLogicDeleteProcessor * 逻辑删除字段值为 {@code 0} 表示数据未删除。 */ @Override - protected Object getLogicNormalValue() { + public Object getLogicNormalValue() { return 0; } @@ -38,8 +38,8 @@ public class TimeStampLogicDeleteProcessor extends AbstractLogicDeleteProcessor * 逻辑删除字段值为 {@code NOW()} 表示数据删除,并记录删除时时间戳。 */ @Override - protected Object getLogicDeletedValue() { + public Object getLogicDeletedValue() { return System.currentTimeMillis(); } -} \ No newline at end of file +} diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java index 8f22ac4b..63db2a0f 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java @@ -1178,12 +1178,15 @@ public class TableInfo { } 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) { - String property = columnInfoMapping.get(logicDeleteColumn).property; - Class setterType = metaObject.getSetterType(property); - Object normalValueOfLogicDelete = FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete(); - metaObject.setValue(property, ConvertUtil.convert(normalValueOfLogicDelete, setterType)); + Object normalValueOfLogicDelete = LogicDeleteManager.getProcessor().getLogicNormalValue(); + if (normalValueOfLogicDelete != null) { + String property = logicDeleteColumn.property; + Class setterType = metaObject.getSetterType(property); + metaObject.setValue(property, ConvertUtil.convert(normalValueOfLogicDelete, setterType)); + } } }