diff --git a/docs/zh/base/configuration.md b/docs/zh/base/configuration.md index 903f144d..f40859e5 100644 --- a/docs/zh/base/configuration.md +++ b/docs/zh/base/configuration.md @@ -8,13 +8,15 @@ SpringBoot 配置文件(`application.yml` 等)主要是用于对 MyBatis 原 mybatis-flex: #...... datasource: - #...... + #...... configuration: - #...... + #...... global-config: - #...... + #...... admin-config: - #...... + #...... + seata-config: + #...... ``` ## mybatis-flex @@ -129,7 +131,28 @@ TypeHandler 扫描路径,如果配置了该属性,SqlSessionFactoryBean 会 - 类型:`java.lang.Object` - 默认值:`1` -逻辑删除数据删除标记值, +逻辑删除数据删除标记值。 + +### logic-delete-column + +- 类型:`java.lang.String` +- 默认值:`del_flag` + +默认的逻辑删除字段。 + +### tenant-column + +- 类型:`java.lang.String` +- 默认值:`tenant_id` + +默认的多租户字段。 + +### version-column + +- 类型:`java.lang.String` +- 默认值:`version` + +默认的乐观锁字段。 ## admin-config @@ -152,4 +175,20 @@ MyBatis-Flex-Admin 连接端点。 - 类型:`String` - 默认值:`null` -MyBatis-Flex-Admin 连接密钥。 \ No newline at end of file +MyBatis-Flex-Admin 连接密钥。 + +## seata-config + +### enable + +- 类型:`boolean` +- 默认值:`false` + +是否启用 Seata 代理数据源。 + +### seata-mode + +- 类型:`com.mybatisflex.spring.boot.MybatisFlexProperties.SeataMode` +- 默认值:`AT` + +使用 Seata AT 模式代理数据源。 diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/FlexGlobalConfig.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/FlexGlobalConfig.java index 0e4f5901..3412ff72 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/FlexGlobalConfig.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/FlexGlobalConfig.java @@ -88,6 +88,21 @@ public class FlexGlobalConfig { */ private int defaultRelationQueryDepth = 2; + /** + * 默认的逻辑删除字段,允许设置 {@code null} 忽略匹配。 + */ + private String logicDeleteColumn = "del_flag"; + + /** + * 默认的多租户字段,允许设置 {@code null} 忽略匹配。 + */ + private String tenantColumn = "tenant_id"; + + /** + * 默认的乐观锁字段,允许设置 {@code null} 忽略匹配。 + */ + private String versionColumn = "version"; + public boolean isPrintBanner() { return printBanner; } @@ -337,6 +352,30 @@ public class FlexGlobalConfig { this.defaultRelationQueryDepth = defaultRelationQueryDepth; } + public String getLogicDeleteColumn() { + return logicDeleteColumn; + } + + public void setLogicDeleteColumn(String logicDeleteColumn) { + this.logicDeleteColumn = logicDeleteColumn; + } + + public String getTenantColumn() { + return tenantColumn; + } + + public void setTenantColumn(String tenantColumn) { + this.tenantColumn = tenantColumn; + } + + public String getVersionColumn() { + return versionColumn; + } + + public void setVersionColumn(String versionColumn) { + this.versionColumn = versionColumn; + } + public FlexDataSource getDataSource() { return (FlexDataSource) getConfiguration().getEnvironment().getDataSource(); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java index 0ef4a0e2..de78dc77 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java @@ -196,6 +196,8 @@ public class TableInfoFactory { List entityFields = getColumnFields(entityClass); + FlexGlobalConfig config = FlexGlobalConfig.getDefaultConfig(); + for (Field field : entityFields) { Column column = field.getAnnotation(Column.class); @@ -233,7 +235,8 @@ public class TableInfoFactory { String columnName = getColumnName(tableInfo.isCamelToUnderline(), field, column); //逻辑删除字段 - if (column != null && column.isLogicDelete()) { + if ((column != null && column.isLogicDelete()) + || columnName.equals(config.getLogicDeleteColumn())) { if (logicDeleteColumn == null) { logicDeleteColumn = columnName; } else { @@ -242,7 +245,8 @@ public class TableInfoFactory { } //乐观锁版本字段 - if (column != null && column.version()) { + if ((column != null && column.version()) + || columnName.equals(config.getVersionColumn())) { if (versionColumn == null) { versionColumn = columnName; } else { @@ -251,7 +255,8 @@ public class TableInfoFactory { } //租户ID 字段 - if (column != null && column.tenantId()) { + if ((column != null && column.tenantId()) + || columnName.equals(config.getTenantColumn())) { if (tenantIdColumn == null) { tenantIdColumn = columnName; } else { diff --git a/mybatis-flex-spring-boot-starter/src/main/java/com/mybatisflex/spring/boot/MybatisFlexProperties.java b/mybatis-flex-spring-boot-starter/src/main/java/com/mybatisflex/spring/boot/MybatisFlexProperties.java index 50e60d91..38913e93 100644 --- a/mybatis-flex-spring-boot-starter/src/main/java/com/mybatisflex/spring/boot/MybatisFlexProperties.java +++ b/mybatis-flex-spring-boot-starter/src/main/java/com/mybatisflex/spring/boot/MybatisFlexProperties.java @@ -778,22 +778,36 @@ public class MybatisFlexProperties { private Object normalValueOfLogicDelete = FlexConsts.LOGIC_DELETE_NORMAL; /** - * 逻辑删除数据删除标记值, + * 逻辑删除数据删除标记值。 */ private Object deletedValueOfLogicDelete = FlexConsts.LOGIC_DELETE_DELETED; /** - * 默认的分页查询时的每页数据量 + * 默认的分页查询时的每页数据量。 */ private int defaultPageSize = 10; /** - * 默认的 Relation 注解查询深度 + * 默认的 Relation 注解查询深度。 */ private int defaultRelationQueryDepth = 2; + /** + * 默认的逻辑删除字段。 + */ + private String logicDeleteColumn = "del_flag"; + + /** + * 默认的多租户字段。 + */ + private String tenantColumn = "tenant_id"; + + /** + * 默认的乐观锁字段。 + */ + private String versionColumn = "version"; public boolean isPrintBanner() { return printBanner; @@ -843,6 +857,30 @@ public class MybatisFlexProperties { this.defaultRelationQueryDepth = defaultRelationQueryDepth; } + public String getLogicDeleteColumn() { + return logicDeleteColumn; + } + + public void setLogicDeleteColumn(String logicDeleteColumn) { + this.logicDeleteColumn = logicDeleteColumn; + } + + public String getTenantColumn() { + return tenantColumn; + } + + public void setTenantColumn(String tenantColumn) { + this.tenantColumn = tenantColumn; + } + + public String getVersionColumn() { + return versionColumn; + } + + public void setVersionColumn(String versionColumn) { + this.versionColumn = versionColumn; + } + void applyTo(FlexGlobalConfig target) { PropertyMapper mapper = PropertyMapper.get().alwaysApplyingWhenNonNull(); mapper.from(isPrintBanner()).to(target::setPrintBanner); @@ -851,6 +889,9 @@ public class MybatisFlexProperties { mapper.from(getDeletedValueOfLogicDelete()).to(target::setDeletedValueOfLogicDelete); mapper.from(getDefaultPageSize()).to(target::setDefaultPageSize); mapper.from(getDefaultRelationQueryDepth()).to(target::setDefaultRelationQueryDepth); + mapper.from(getLogicDeleteColumn()).to(target::setLogicDeleteColumn); + mapper.from(getVersionColumn()).to(target::setVersionColumn); + mapper.from(getTenantColumn()).to(target::setTenantColumn); } } diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account.java index 50a06088..bc6e6f58 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/Account.java @@ -49,7 +49,7 @@ public class Account extends BaseEntity implements Serializable, AgeAware { @Column(typeHandler = Fastjson2TypeHandler.class) private Map options; - @Column(isLogicDelete = true) +// @Column(isLogicDelete = true) private Boolean isDelete; private List
articles; diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountTester.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountTester.java index 6c9b03cd..aa5ef7ef 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountTester.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/AccountTester.java @@ -15,6 +15,7 @@ */ package com.mybatisflex.test; +import com.mybatisflex.core.FlexGlobalConfig; import com.mybatisflex.core.MybatisFlexBootstrap; import com.mybatisflex.core.audit.AuditManager; import com.mybatisflex.core.audit.ConsoleMessageCollector; @@ -53,6 +54,9 @@ public class AccountTester { .addScript("data.sql") .build(); + FlexGlobalConfig.getDefaultConfig() + .setLogicDeleteColumn("is_delete"); + MybatisFlexBootstrap bootstrap = MybatisFlexBootstrap.getInstance() .setDataSource(dataSource) .setLogImpl(StdOutImpl.class) @@ -72,6 +76,11 @@ public class AccountTester { articleMapper = bootstrap.getMapper(ArticleMapper.class); } + @Test + public void testLogicDelete() { + accountMapper.selectAll().forEach(System.out::println); + } + @Test public void testExecutor() { DbChain.create() diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantAccount.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantAccount.java index 1c19ec49..58b0bbdf 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantAccount.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantAccount.java @@ -16,7 +16,10 @@ package com.mybatisflex.test; -import com.mybatisflex.annotation.*; +import com.mybatisflex.annotation.ColumnMask; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; +import com.mybatisflex.annotation.Table; import com.mybatisflex.core.mask.Masks; import java.util.Date; @@ -34,7 +37,7 @@ public class TenantAccount { private Date birthday; - @Column(tenantId = true) +// @Column(tenantId = true) private Long tenantId; public Long getId() { diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantTester.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantTester.java index da4b5539..99454565 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantTester.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/TenantTester.java @@ -18,8 +18,6 @@ package com.mybatisflex.test; import com.mybatisflex.core.MybatisFlexBootstrap; import com.mybatisflex.core.audit.AuditManager; import com.mybatisflex.core.audit.ConsoleMessageCollector; -import com.mybatisflex.core.query.QueryWrapper; -import com.mybatisflex.core.tenant.TenantFactory; import com.mybatisflex.core.tenant.TenantManager; import com.mybatisflex.mapper.TenantAccountMapper; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; @@ -27,10 +25,6 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import javax.sql.DataSource; -import static com.mybatisflex.core.query.QueryMethods.select; -import static com.mybatisflex.test.table.AccountTableDef.ACCOUNT; -import static com.mybatisflex.test.table.TenantAccountTableDef.TENANT_ACCOUNT; - public class TenantTester { public static void main(String[] args) { @@ -52,24 +46,22 @@ public class TenantTester { AuditManager.setMessageCollector(new ConsoleMessageCollector()); //配置 tenantFactory - TenantManager.setTenantFactory(new TenantFactory() { - @Override - public Object[] getTenantIds() { - return new Object[]{1, 2}; - } - }); + TenantManager.setTenantFactory(() -> new Object[]{1, 2}); - TenantAccountMapper mapper = MybatisFlexBootstrap.getInstance().getMapper(TenantAccountMapper.class); + TenantAccountMapper mapper = MybatisFlexBootstrap.getInstance() + .getMapper(TenantAccountMapper.class); - mapper.selectListByQuery(QueryWrapper.create() - .select(TENANT_ACCOUNT.ALL_COLUMNS) - .from(TENANT_ACCOUNT.as("c"), ACCOUNT.as("b")) - .where(TENANT_ACCOUNT.ID.eq(ACCOUNT.ID)) - .and(TENANT_ACCOUNT.ID.eq(1)) - .unionAll(select(TENANT_ACCOUNT.ALL_COLUMNS).from(TENANT_ACCOUNT) - .where(TENANT_ACCOUNT.ID.eq(2)) - ) - ); + mapper.selectAll().forEach(System.out::println); + +// mapper.selectListByQuery(QueryWrapper.create() +// .select(TENANT_ACCOUNT.ALL_COLUMNS) +// .from(TENANT_ACCOUNT.as("c"), ACCOUNT.as("b")) +// .where(TENANT_ACCOUNT.ID.eq(ACCOUNT.ID)) +// .and(TENANT_ACCOUNT.ID.eq(1)) +// .unionAll(select(TENANT_ACCOUNT.ALL_COLUMNS).from(TENANT_ACCOUNT) +// .where(TENANT_ACCOUNT.ID.eq(2)) +// ) +// ); // mapper.deleteBatchByIds(Arrays.asList(1, 2)); diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/resources/schema03.sql b/mybatis-flex-test/mybatis-flex-native-test/src/main/resources/schema03.sql index 2d9f7202..17a3b71e 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/resources/schema03.sql +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/resources/schema03.sql @@ -4,5 +4,5 @@ CREATE TABLE IF NOT EXISTS `tb_account` `user_name` VARCHAR(100), `age` INTEGER, `birthday` DATETIME, - `tenant_id` INTEGER(11) -); \ No newline at end of file + `tenant_id` INTEGER +);