Skip to content

Commit 1de9e88

Browse files
author
hewei
committed
逻辑删除插件增加基于注解的枚举实现
1 parent 095470f commit 1de9e88

File tree

2 files changed

+75
-16
lines changed

2 files changed

+75
-16
lines changed

README.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,9 @@ public class Test {
472472
- 查询构造工具中增加逻辑删除条件andLogicalDeleted(boolean);
473473
- 数据Model增加逻辑删除条件andLogicalDeleted(boolean);
474474
- 增加逻辑删除常量IS_DELETED(已删除 默认值)、NOT_DELETED(未删除 默认值)([[issues#11]](https://github.com/itfsw/mybatis-generator-plugin/issues/11));
475+
- 增加逻辑删除枚举,通过注解覆盖逻辑删除配置,具体使用参照[状态枚举生成插件(EnumTypeStatusPlugin)](#21-状态枚举生成插件)
476+
477+
>warning: 使用注解生成逻辑删除枚举时,枚举数量必须大于等于2,且第一个代表未删除,第二个代表删除。同时不必配置enumColumns选项,逻辑删除插件使用logicalDeleteColumn覆盖该配置。
475478
476479
插件:
477480
```xml
@@ -485,6 +488,9 @@ public class Test {
485488
<property name="logicalDeleteValue" value="9"/>
486489
<!-- 逻辑删除-未删除值 -->
487490
<property name="logicalUnDeleteValue" value="0"/>
491+
492+
<!-- 是否生成逻辑删除常量(只有开启时 logicalDeleteConstName、logicalUnDeleteConstName 才生效) -->
493+
<property name="enableLogicalDeleteConst" value="true"/>
488494
<!-- 逻辑删除常量名称,不配置默认为 IS_DELETED -->
489495
<property name="logicalDeleteConstName" value="IS_DELETED"/>
490496
<!-- 逻辑删除常量(未删除)名称,不配置默认为 NOT_DELETED -->
@@ -536,9 +542,58 @@ public class Test {
536542
// 5. selectByPrimaryKeyWithLogicalDelete V1.0.18 版本增加
537543
// 因为之前觉得既然拿到了主键这种查询没有必要,但是实际使用中可能存在根据主键判断是否逻辑删除的情况,这种场景还是有用的
538544
this.tbMapper.selectByPrimaryKeyWithLogicalDelete(1, true);
545+
546+
// 6. 使用逻辑删除枚举
547+
Tb tb = Tb.builder()
548+
.delFlag(Tb.DelFlag.IS_DELETED) // 删除
549+
.delFlag(Tb.DelFlag.NOT_DELETED) // 未删除
550+
.build()
551+
.andLogicalDeleted(true); // 也可以在这里使用true|false设置逻辑删除
552+
}
553+
}
554+
```
555+
通过注解覆盖逻辑删除配置
556+
```sql
557+
CREATE TABLE `tb` (
558+
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '注释1',
559+
`del_flag` smallint(3) COMMENT '注释[enable(1):第一项必须是代表未删除, disable(0):第二项必须是代表已删除, other(2):当然还可以附加其他状态]',
560+
PRIMARY KEY (`id`)
561+
);
562+
```
563+
```java
564+
/**
565+
* 生成的Tb会根据注释覆盖逻辑删除配置
566+
*/
567+
public class Tb {
568+
public static final Short ENABLE = DelFlag.ENABLE.value();
569+
public static final Short DISABLE = DelFlag.DISABLE.value();
570+
571+
public enum DelFlag {
572+
ENABLE(new Short("1"), "第一项必须是代表未删除"),
573+
DISABLE(new Short("0"), "第二项必须是代表已删除"),
574+
OTHER(new Short("2"), "当然还可以附加其他状态");
575+
576+
private final Short value;
577+
private final String name;
578+
579+
DelFlag(Short value, String name) {
580+
this.value = value;
581+
this.name = name;
582+
}
583+
584+
public Short getValue() {
585+
return this.value;
586+
}
587+
public Short value() {
588+
return this.value;
589+
}
590+
public String getName() {
591+
return this.name;
592+
}
539593
}
540594
}
541595
```
596+
542597
### 8. 数据Model属性对应Column获取插件
543598
项目中我们有时需要获取数据Model对应数据库字段的名称,一般直接根据数据Model的属性就可以猜出数据库对应column的名字,可是有的时候当column使用了columnOverride或者columnRenamingRule时就需要去看数据库设计了,所以提供了这个插件获取model对应的数据库Column。
544599
* 配合Example Criteria 增强插件(ExampleEnhancedPlugin)使用,这个插件还提供了asc()和desc()方法配合Example的orderBy方法效果更佳。

src/main/java/com/itfsw/mybatis/generator/plugins/LogicalDeletePlugin.java

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,11 @@ public class LogicalDeletePlugin extends BasePlugin {
9393
/**
9494
* 逻辑删除常量
9595
*/
96-
private String logicalDeleteConstName;
96+
private String logicalDeleteConstName = DEFAULT_LOGICAL_DELETE_NAME;
9797
/**
9898
* 逻辑删除常量(未删除)
9999
*/
100-
private String logicalUnDeleteConstName;
100+
private String logicalUnDeleteConstName = DEFAULT_LOGICAL_UN_DELETE_NAME;
101101
/**
102102
* 是否支持常量类型
103103
*/
@@ -128,7 +128,18 @@ public void initialized(IntrospectedTable introspectedTable) {
128128
warnings.add("itfsw(逻辑删除插件):" + introspectedTable.getFullyQualifiedTable() + "没有找到您配置的逻辑删除列(" + introspectedTable.getTableConfigurationProperty(PRO_LOGICAL_DELETE_COLUMN) + ")!");
129129
}
130130

131-
// 2. 优先借助 EnumTypeStatusPlugin 插件,去注解里面解析枚举
131+
// 2. 获取逻辑删除常量值
132+
this.enableLogicalDeleteConst = properties.getProperty(PRO_ENABLE_LOGICAL_DELETE_CONST) == null ? true : StringUtility.isTrue(properties.getProperty(PRO_ENABLE_LOGICAL_DELETE_CONST));
133+
if (this.enableLogicalDeleteConst) {
134+
if (properties.getProperty(PRO_LOGICAL_DELETE_CONST_NAME) != null) {
135+
this.logicalDeleteConstName = properties.getProperty(PRO_LOGICAL_DELETE_CONST_NAME).toUpperCase();
136+
}
137+
if (properties.getProperty(PRO_LOGICAL_UN_DELETE_CONST_NAME) != null) {
138+
this.logicalUnDeleteConstName = properties.getProperty(PRO_LOGICAL_UN_DELETE_CONST_NAME).toUpperCase();
139+
}
140+
}
141+
142+
// 3. 优先借助 EnumTypeStatusPlugin 插件,去注解里面解析枚举
132143
if (this.logicalDeleteColumn != null) {
133144
EnumTypeStatusPlugin.EnumInfo enumInfo = null;
134145
try {
@@ -146,7 +157,9 @@ public void initialized(IntrospectedTable introspectedTable) {
146157
// 这个是注释里配置了枚举
147158
if (enumInfo.hasItems() && enumInfo.getItems().size() >= 2) {
148159
this.logicalUnDeleteValue = enumInfo.getItems().get(0).getOriginalValue();
160+
this.logicalUnDeleteConstName = enumInfo.getItems().get(0).getName();
149161
this.logicalDeleteValue = enumInfo.getItems().get(1).getOriginalValue();
162+
this.logicalDeleteConstName = enumInfo.getItems().get(1).getName();
150163
this.logicalDeleteEnum = enumInfo.generateEnum(commentGenerator, introspectedTable);
151164
} else {
152165
// 没有在注释里配置读取xml中配置的
@@ -158,35 +171,28 @@ public void initialized(IntrospectedTable introspectedTable) {
158171
if (introspectedTable.getTableConfigurationProperty(PRO_LOGICAL_UN_DELETE_VALUE) != null) {
159172
this.logicalUnDeleteValue = introspectedTable.getTableConfigurationProperty(PRO_LOGICAL_UN_DELETE_VALUE);
160173
}
161-
// 3. 判断逻辑删除值是否配置了
174+
// 4. 判断逻辑删除值是否配置了
162175
if (this.logicalDeleteValue == null || this.logicalUnDeleteValue == null) {
163176
this.logicalDeleteColumn = null;
164177
warnings.add("itfsw(逻辑删除插件):" + introspectedTable.getFullyQualifiedTable() + "没有找到您配置的逻辑删除值,请全局或者局部配置logicalDeleteValue和logicalUnDeleteValue值!");
165178
} else {
166-
enumInfo.addItem(DEFAULT_LOGICAL_UN_DELETE_NAME, "未删除", this.logicalUnDeleteValue);
167-
enumInfo.addItem(DEFAULT_LOGICAL_DELETE_NAME, "已删除", this.logicalDeleteValue);
179+
enumInfo.addItem(this.logicalUnDeleteConstName, "未删除", this.logicalUnDeleteValue);
180+
enumInfo.addItem(this.logicalDeleteConstName, "已删除", this.logicalDeleteValue);
168181
this.logicalDeleteEnum = enumInfo.generateEnum(commentGenerator, introspectedTable);
169182
}
170183
}
171184
}
172185
}
173186
}
174187

175-
// 4. 防止增强的selectByPrimaryKey中逻辑删除键冲突
188+
// 5. 防止增强的selectByPrimaryKey中逻辑删除键冲突
176189
if (this.logicalDeleteColumn != null) {
177190
Field logicalDeleteField = JavaBeansUtil.getJavaBeansField(this.logicalDeleteColumn, context, introspectedTable);
178191
if (logicalDeleteField.getName().equals(PARAMETER_LOGICAL_DELETED)) {
179192
this.logicalDeleteColumn = null;
180193
warnings.add("itfsw(逻辑删除插件):" + introspectedTable.getFullyQualifiedTable() + "配置的逻辑删除列和插件保留关键字(" + PARAMETER_LOGICAL_DELETED + ")冲突!");
181194
}
182195
}
183-
184-
// 5. 获取逻辑删除常量值
185-
this.enableLogicalDeleteConst = properties.getProperty(PRO_ENABLE_LOGICAL_DELETE_CONST) == null ? true : StringUtility.isTrue(properties.getProperty(PRO_ENABLE_LOGICAL_DELETE_CONST));
186-
if (this.enableLogicalDeleteConst) {
187-
this.logicalDeleteConstName = properties.getProperty(PRO_LOGICAL_DELETE_CONST_NAME) != null ? properties.getProperty(PRO_LOGICAL_DELETE_CONST_NAME).toUpperCase() : DEFAULT_LOGICAL_DELETE_NAME;
188-
this.logicalUnDeleteConstName = properties.getProperty(PRO_LOGICAL_UN_DELETE_CONST_NAME) != null ? properties.getProperty(PRO_LOGICAL_UN_DELETE_CONST_NAME).toUpperCase() : DEFAULT_LOGICAL_UN_DELETE_NAME;
189-
}
190196
}
191197

192198
/**
@@ -460,14 +466,12 @@ public boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, Int
460466
this.logicalDeleteColumn.getFullyQualifiedJavaType(),
461467
this.getEnumConstantValue(false)
462468
);
463-
logicalUnDeleteConstField.addAnnotation("@Deprecated");
464469
commentGenerator.addFieldComment(logicalUnDeleteConstField, introspectedTable);
465470
Field logicalDeleteConstField = JavaElementGeneratorTools.generateStaticFinalField(
466471
this.logicalDeleteConstName,
467472
this.logicalDeleteColumn.getFullyQualifiedJavaType(),
468473
this.getEnumConstantValue(true)
469474
);
470-
logicalDeleteConstField.addAnnotation("@Deprecated");
471475
commentGenerator.addFieldComment(logicalDeleteConstField, introspectedTable);
472476

473477
// 常量放在字段开头

0 commit comments

Comments
 (0)