Mybatis-Flex核心功能之@Column

发布时间 2023-10-14 22:50:05作者: 我也有梦想呀

1、是什么?

MyBatis-Flex 提供了 @Column 用来对字段进行更多的配置

public @interface Column {

    /**
     * 字段名称
     */
    String value() default "";

    /**
     * 是否忽略该字段,可能只是业务字段,而非数据库对应字段
     */
    boolean ignore() default false;

    /**
     * insert 的时候默认值,这个值会直接被拼接到 sql 而不通过参数设置
     */
    String onInsertValue() default "";

    /**
     * update 的时候自动赋值,这个值会直接被拼接到 sql 而不通过参数设置
     */
    String onUpdateValue() default "";

    /**
     * 是否是大字段,大字段 APT 不会生成到 DEFAULT_COLUMNS 里
     */
    boolean isLarge() default false;

    /**
     * 是否是逻辑删除字段,一张表中只能存在 1 一个逻辑删除字段
     * 逻辑删除的字段,被删除时,会设置为 1,正常状态为 0
     */
    boolean isLogicDelete() default false;

    /**
     * 是否为乐观锁字段,若是乐观锁字段的话,数据更新的时候会去检测当前版本号,若更新成功的话会设置当前版本号 +1
     * 只能用于数值的字段
     */
    boolean version() default false;

    /**
     * 配置的 jdbcType
     */
    JdbcType jdbcType() default JdbcType.UNDEFINED;

    /**
     * 自定义 TypeHandler
     */
    Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class;

}

2、怎么玩?

(1) value

value 是用来标识列名的,默认情况下, entity 中的字段转换为列名默认以下划线的方式进行转换, 例如,userId 对应的列名为 user_id。

image

(2) ignore

当我们为了业务需要,在 entity 类中添加了某个字段,但是数据库却不存在该列时,使用 @Column(ignore = true) 修饰。

image

值得注意的是,像List、Map等集合嵌套类型会被自动忽略,所以就不需要进行ignore=true进行忽略了
image

(3) onInsertValue、onUpdateValue

image

image

(4) isLarge

用于标识这个字段是否是大字段,比如存放文章的文章字段,在一般的场景中是没必要对这个字段进行查询的, 若字段被表示为 isLarge,那么 APT 生成 "ARTICLE" 类时,默认不会存放在 DEFAULT_COLUMNS 中

@Column(isLarge = true)
private String content;

image

image

(5) isLogicDelete

逻辑删除指的是在删除数据的时候,并非真正的去删除,而是将表中列所对应的状态字段(status)做修改操作, 实际上并未删除目标数据。

我们可以进行表的字段设计时,用一个列标识该数据的 "删除状态",在 mybatis-flex 中,正常状态的值为 0, 已删除 的值为 1(可以通过设置 FlexGlobalConfig 来修改这个值)。

@Column(value = "is_deleted", isLogicDelete = true)
private Boolean deleted;

image

跳过逻辑删除

@Test
    public void testRealDeleted() {
        Boolean res = LogicDeleteManager.execWithoutLogicDelete(() -> addressService.removeById(1880782697));
        Assertions.assertTrue(res);
    }
  • 逻辑删除的默认值配置
 FlexGlobalConfig defaultConfig = FlexGlobalConfig.getDefaultConfig();
        defaultConfig.setNormalValueOfLogicDelete(true);
        defaultConfig.setDeletedValueOfLogicDelete(false);

        LogicDeleteManager.setProcessor(new BooleanLogicDeleteProcessor());
(6) version

用于当有多个用户(或者多场景)去同时修改同一条数据的时候,只允许有一个修改成功。

使用一个字段,用于记录数据的版本,当修改数据的时候,会去检测当前版本是否是正在修改的版本,同时修改成功后会把 版本号 + 1。

/**
* 设置为乐观锁字段
*/
@Column(version = true)
private Integer version;

@Test
public void testVersion() {
	QueryWrapper wrapper = QueryWrapper.create()
		.from(ADDRESS)
		.where(ADDRESS.ID.eq(4));
	Address address = new Address();
	address.setProvince("江西省");
	address.setCity("南昌市");
	address.setDistrict("青山湖区");
	boolean res = addressService.update(address, wrapper);
	Assertions.assertTrue(res);
}

image

(7) tenantId

多租户技术(英语:multi-tenancy technology),是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件,并且仍可确保各用户间数据的隔离性。

多租户简单来说是指一个单独的实例可以为多个用户(或组织)服务。多租户技术要求所有用户共用同一个数据中心,但能提供多个客户端相同甚至可定制化的服务,并且仍然可以保障客户的数据隔离。

多租户的数据隔离有许多种方案,但最为常见的是以列进行隔离的方式。MyBatis-Flex 内置的正是通过指定的列(租户ID tenant_id)进行隔离的方案。

@Column(value = "tenant_id", tenantId = true)
private Integer tenantId;
package com.ly.config;

import com.ly.factory.TenantIdFactory;
import com.mybatisflex.core.tenant.TenantFactory;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;

/**
 * @author ly (个人博客:https://www.cnblogs.com/ybbit)
 * @date 2023-10-14  16:47
 * @tags 喜欢就去努力的争取
 */
@SpringBootConfiguration
public class MyConfig {
    @Bean
    public TenantFactory tenantFactory() {
        return new TenantIdFactory();
    }
}

最后我们再执行CRUD的时候就会为我们评级上tenantId的值
image

全局配置多租户字段,这样就可以省略实体类属性上的@Column(tenantId = true)注解了。

// 全局设置租户ID字段
FlexGlobalConfig.getDefaultConfig().setTenantColumn("tenant_id");

忽略多租户信息

// 忽略租户信息
List<Address> addresses = TenantManager.withoutTenantCondition(() -> addressService.list());
addresses.forEach(System.out::println);

image