Conflicts:
	mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java
This commit is contained in:
开源海哥 2023-08-10 12:33:37 +08:00
commit fa4f2030bd
9 changed files with 167 additions and 39 deletions

View File

@ -8,13 +8,15 @@ SpringBoot 配置文件(`application.yml` 等)主要是用于对 MyBatis 原
mybatis-flex: mybatis-flex:
#...... #......
datasource: datasource:
#...... #......
configuration: configuration:
#...... #......
global-config: global-config:
#...... #......
admin-config: admin-config:
#...... #......
seata-config:
#......
``` ```
## mybatis-flex ## mybatis-flex
@ -129,7 +131,28 @@ TypeHandler 扫描路径如果配置了该属性SqlSessionFactoryBean 会
- 类型:`java.lang.Object` - 类型:`java.lang.Object`
- 默认值:`1` - 默认值:`1`
逻辑删除数据删除标记值, 逻辑删除数据删除标记值。
### logic-delete-column
- 类型:`java.lang.String`
- 默认值:`del_flag`
默认的逻辑删除字段。
### tenant-column
- 类型:`java.lang.String`
- 默认值:`tenant_id`
默认的多租户字段。
### version-column
- 类型:`java.lang.String`
- 默认值:`version`
默认的乐观锁字段。
## admin-config ## admin-config
@ -152,4 +175,20 @@ MyBatis-Flex-Admin 连接端点。
- 类型:`String` - 类型:`String`
- 默认值:`null` - 默认值:`null`
MyBatis-Flex-Admin 连接密钥。 MyBatis-Flex-Admin 连接密钥。
## seata-config
### enable
- 类型:`boolean`
- 默认值:`false`
是否启用 Seata 代理数据源。
### seata-mode
- 类型:`com.mybatisflex.spring.boot.MybatisFlexProperties.SeataMode`
- 默认值:`AT`
使用 Seata AT 模式代理数据源。

View File

@ -88,6 +88,21 @@ public class FlexGlobalConfig {
*/ */
private int defaultRelationQueryDepth = 2; 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() { public boolean isPrintBanner() {
return printBanner; return printBanner;
} }
@ -337,6 +352,30 @@ public class FlexGlobalConfig {
this.defaultRelationQueryDepth = defaultRelationQueryDepth; 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() { public FlexDataSource getDataSource() {
return (FlexDataSource) getConfiguration().getEnvironment().getDataSource(); return (FlexDataSource) getConfiguration().getEnvironment().getDataSource();
} }

View File

@ -196,6 +196,8 @@ public class TableInfoFactory {
List<Field> entityFields = getColumnFields(entityClass); List<Field> entityFields = getColumnFields(entityClass);
FlexGlobalConfig config = FlexGlobalConfig.getDefaultConfig();
for (Field field : entityFields) { for (Field field : entityFields) {
Column column = field.getAnnotation(Column.class); Column column = field.getAnnotation(Column.class);
@ -233,7 +235,8 @@ public class TableInfoFactory {
String columnName = getColumnName(tableInfo.isCamelToUnderline(), field, column); String columnName = getColumnName(tableInfo.isCamelToUnderline(), field, column);
//逻辑删除字段 //逻辑删除字段
if (column != null && column.isLogicDelete()) { if ((column != null && column.isLogicDelete())
|| columnName.equals(config.getLogicDeleteColumn())) {
if (logicDeleteColumn == null) { if (logicDeleteColumn == null) {
logicDeleteColumn = columnName; logicDeleteColumn = columnName;
} else { } 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) { if (versionColumn == null) {
versionColumn = columnName; versionColumn = columnName;
} else { } else {
@ -251,7 +255,8 @@ public class TableInfoFactory {
} }
//租户ID 字段 //租户ID 字段
if (column != null && column.tenantId()) { if ((column != null && column.tenantId())
|| columnName.equals(config.getTenantColumn())) {
if (tenantIdColumn == null) { if (tenantIdColumn == null) {
tenantIdColumn = columnName; tenantIdColumn = columnName;
} else { } else {

View File

@ -778,22 +778,36 @@ public class MybatisFlexProperties {
private Object normalValueOfLogicDelete = FlexConsts.LOGIC_DELETE_NORMAL; private Object normalValueOfLogicDelete = FlexConsts.LOGIC_DELETE_NORMAL;
/** /**
* 逻辑删除数据删除标记值 * 逻辑删除数据删除标记值
*/ */
private Object deletedValueOfLogicDelete = FlexConsts.LOGIC_DELETE_DELETED; private Object deletedValueOfLogicDelete = FlexConsts.LOGIC_DELETE_DELETED;
/** /**
* 默认的分页查询时的每页数据量 * 默认的分页查询时的每页数据量
*/ */
private int defaultPageSize = 10; private int defaultPageSize = 10;
/** /**
* 默认的 Relation 注解查询深度 * 默认的 Relation 注解查询深度
*/ */
private int defaultRelationQueryDepth = 2; private int defaultRelationQueryDepth = 2;
/**
* 默认的逻辑删除字段
*/
private String logicDeleteColumn = "del_flag";
/**
* 默认的多租户字段
*/
private String tenantColumn = "tenant_id";
/**
* 默认的乐观锁字段
*/
private String versionColumn = "version";
public boolean isPrintBanner() { public boolean isPrintBanner() {
return printBanner; return printBanner;
@ -843,6 +857,30 @@ public class MybatisFlexProperties {
this.defaultRelationQueryDepth = defaultRelationQueryDepth; 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) { void applyTo(FlexGlobalConfig target) {
PropertyMapper mapper = PropertyMapper.get().alwaysApplyingWhenNonNull(); PropertyMapper mapper = PropertyMapper.get().alwaysApplyingWhenNonNull();
mapper.from(isPrintBanner()).to(target::setPrintBanner); mapper.from(isPrintBanner()).to(target::setPrintBanner);
@ -851,6 +889,9 @@ public class MybatisFlexProperties {
mapper.from(getDeletedValueOfLogicDelete()).to(target::setDeletedValueOfLogicDelete); mapper.from(getDeletedValueOfLogicDelete()).to(target::setDeletedValueOfLogicDelete);
mapper.from(getDefaultPageSize()).to(target::setDefaultPageSize); mapper.from(getDefaultPageSize()).to(target::setDefaultPageSize);
mapper.from(getDefaultRelationQueryDepth()).to(target::setDefaultRelationQueryDepth); mapper.from(getDefaultRelationQueryDepth()).to(target::setDefaultRelationQueryDepth);
mapper.from(getLogicDeleteColumn()).to(target::setLogicDeleteColumn);
mapper.from(getVersionColumn()).to(target::setVersionColumn);
mapper.from(getTenantColumn()).to(target::setTenantColumn);
} }
} }

View File

@ -49,7 +49,7 @@ public class Account extends BaseEntity implements Serializable, AgeAware {
@Column(typeHandler = Fastjson2TypeHandler.class) @Column(typeHandler = Fastjson2TypeHandler.class)
private Map<String, Object> options; private Map<String, Object> options;
@Column(isLogicDelete = true) // @Column(isLogicDelete = true)
private Boolean isDelete; private Boolean isDelete;
private List<Article> articles; private List<Article> articles;

View File

@ -15,6 +15,7 @@
*/ */
package com.mybatisflex.test; package com.mybatisflex.test;
import com.mybatisflex.core.FlexGlobalConfig;
import com.mybatisflex.core.MybatisFlexBootstrap; import com.mybatisflex.core.MybatisFlexBootstrap;
import com.mybatisflex.core.audit.AuditManager; import com.mybatisflex.core.audit.AuditManager;
import com.mybatisflex.core.audit.ConsoleMessageCollector; import com.mybatisflex.core.audit.ConsoleMessageCollector;
@ -53,6 +54,9 @@ public class AccountTester {
.addScript("data.sql") .addScript("data.sql")
.build(); .build();
FlexGlobalConfig.getDefaultConfig()
.setLogicDeleteColumn("is_delete");
MybatisFlexBootstrap bootstrap = MybatisFlexBootstrap.getInstance() MybatisFlexBootstrap bootstrap = MybatisFlexBootstrap.getInstance()
.setDataSource(dataSource) .setDataSource(dataSource)
.setLogImpl(StdOutImpl.class) .setLogImpl(StdOutImpl.class)
@ -72,6 +76,11 @@ public class AccountTester {
articleMapper = bootstrap.getMapper(ArticleMapper.class); articleMapper = bootstrap.getMapper(ArticleMapper.class);
} }
@Test
public void testLogicDelete() {
accountMapper.selectAll().forEach(System.out::println);
}
@Test @Test
public void testExecutor() { public void testExecutor() {
DbChain.create() DbChain.create()

View File

@ -16,7 +16,10 @@
package com.mybatisflex.test; 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 com.mybatisflex.core.mask.Masks;
import java.util.Date; import java.util.Date;
@ -34,7 +37,7 @@ public class TenantAccount {
private Date birthday; private Date birthday;
@Column(tenantId = true) // @Column(tenantId = true)
private Long tenantId; private Long tenantId;
public Long getId() { public Long getId() {

View File

@ -18,8 +18,6 @@ package com.mybatisflex.test;
import com.mybatisflex.core.MybatisFlexBootstrap; import com.mybatisflex.core.MybatisFlexBootstrap;
import com.mybatisflex.core.audit.AuditManager; import com.mybatisflex.core.audit.AuditManager;
import com.mybatisflex.core.audit.ConsoleMessageCollector; 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.core.tenant.TenantManager;
import com.mybatisflex.mapper.TenantAccountMapper; import com.mybatisflex.mapper.TenantAccountMapper;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
@ -27,10 +25,6 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import javax.sql.DataSource; 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 class TenantTester {
public static void main(String[] args) { public static void main(String[] args) {
@ -52,24 +46,22 @@ public class TenantTester {
AuditManager.setMessageCollector(new ConsoleMessageCollector()); AuditManager.setMessageCollector(new ConsoleMessageCollector());
//配置 tenantFactory //配置 tenantFactory
TenantManager.setTenantFactory(new TenantFactory() { TenantManager.setTenantFactory(() -> new Object[]{1, 2});
@Override
public Object[] getTenantIds() {
return new Object[]{1, 2};
}
});
TenantAccountMapper mapper = MybatisFlexBootstrap.getInstance().getMapper(TenantAccountMapper.class); TenantAccountMapper mapper = MybatisFlexBootstrap.getInstance()
.getMapper(TenantAccountMapper.class);
mapper.selectListByQuery(QueryWrapper.create() mapper.selectAll().forEach(System.out::println);
.select(TENANT_ACCOUNT.ALL_COLUMNS)
.from(TENANT_ACCOUNT.as("c"), ACCOUNT.as("b")) // mapper.selectListByQuery(QueryWrapper.create()
.where(TENANT_ACCOUNT.ID.eq(ACCOUNT.ID)) // .select(TENANT_ACCOUNT.ALL_COLUMNS)
.and(TENANT_ACCOUNT.ID.eq(1)) // .from(TENANT_ACCOUNT.as("c"), ACCOUNT.as("b"))
.unionAll(select(TENANT_ACCOUNT.ALL_COLUMNS).from(TENANT_ACCOUNT) // .where(TENANT_ACCOUNT.ID.eq(ACCOUNT.ID))
.where(TENANT_ACCOUNT.ID.eq(2)) // .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)); // mapper.deleteBatchByIds(Arrays.asList(1, 2));

View File

@ -4,5 +4,5 @@ CREATE TABLE IF NOT EXISTS `tb_account`
`user_name` VARCHAR(100), `user_name` VARCHAR(100),
`age` INTEGER, `age` INTEGER,
`birthday` DATETIME, `birthday` DATETIME,
`tenant_id` INTEGER(11) `tenant_id` INTEGER
); );