mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-07 17:18:24 +08:00
Merge branch 'main' of https://gitee.com/mybatis-flex/mybatis-flex
Conflicts: mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfoFactory.java
This commit is contained in:
commit
fa4f2030bd
@ -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 模式代理数据源。
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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));
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
);
|
);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user