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。

(2) ignore

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

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

(3) onInsertValue、onUpdateValue

(4) isLarge

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

@Column(isLarge = true)
private String content;

(5) isLogicDelete

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

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

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

跳过逻辑删除

@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);
}

(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的值

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

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

忽略多租户信息

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

Mybatis-Flex核心功能之@Column的更多相关文章

  1. Mybatis的核心配置

    之前了解了Mybatis的基本用法,现在学习一下Mybatis框架中的核心对象以及映射文件和配置文件,来深入的了解这个框架. 1.Mybatis的核心对象 使用MyBatis框架时,主要涉及两个核心对 ...

  2. 掌握Mybatis的核心配置文件

    一.配置文件结构 MyBatis的核心配置文件配置了MyBatis的一些全局信息,包含数据库连接信息和MyBatis运行时所需的各种特性,以及设置和影响MyBatis行为的一些属性. 该配置文件的元素 ...

  3. Spring 核心功能演示

    Spring 核心功能演示 Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 SpringBoot, ...

  4. 源码分析 | 手写mybait-spring核心功能(干货好文一次学会工厂bean、类代理、bean注册的使用)

    作者:小傅哥 博客:https://bugstack.cn - 汇总系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言介绍 一个知识点的学习过程基本分为:运行helloworld ...

  5. 【java框架】MyBatis-Plus(1)--MyBatis-Plus快速上手开发及核心功能体验

    1.MyBatis-Plus入门开发及配置 1.1.MyBatis-Plus简介 MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变, ...

  6. 带连接池的netty客户端核心功能实现剖解

    带连接池的netty客户端核心功能实现剖析 带连接池的netty的客户端核心功能实现剖析 本文为原创,转载请注明出处 源码地址: https://github.com/zhangxianwu/ligh ...

  7. Chrome扩展开发之四——核心功能的实现思路

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  8. ES6,ES2105核心功能一览,js新特性详解

    ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...

  9. discuz论坛apache日志hadoop大数据分析项目:清洗数据核心功能解说及代码实现

    discuz论坛apache日志hadoop大数据分析项目:清洗数据核心功能解说及代码实现http://www.aboutyun.com/thread-8637-1-1.html(出处: about云 ...

  10. k8s 核心功能 - 每天5分钟玩转 Docker 容器技术(116)

    本节带领大家快速体验 k8s 的核心功能:应用部署.访问.Scale Up/Down 以及滚动更新. 部署应用 执行命令: kubectl run kubernetes-bootcamp \ --im ...

随机推荐

  1. API对接需求如何做需求调研,需要注意什么?

    随着互联网的发展,越来越多的企业开始将自己的业务系统通过API接口与其他系统进行对接,以便于数据的共享.协同操作等.在进行API对接之前,需要对用户需求进行深入的调研,以便于能够准确的设计出满足用户需 ...

  2. 如何做一个api接口?

    程序员是公司里的技术岗位,是产品经理最亲密的伙伴.但是程序员可以理解产品经理的工作,产品经理却不一定理解程序员的工作,所以经常被无良程序员欺骗.从API接口这个维度,分析API的概念以及为什么要了解它 ...

  3. 关于api数据接口应用

    在当今互联网时代,API数据接口应用已经成为各行各业不可替代的技术,它可以让开发者更加轻松地访问和使用各种功能和数据,从而提高开发效率和用户体验.下面就让我们来详细了解API数据接口应用的相关内容. ...

  4. 《Python魔法大冒险》010 魔法宝箱:列表与元组的探险

    城堡的大门 随着小鱼和魔法师的深入,他们来到了一个古老的废弃城堡.城堡的大门上挂着一个巨大的锁,而锁的旁边有一排小抽屉,每个抽屉里都有一个物品. 魔法师对小鱼说:"这是一个古老的魔法宝箱,小 ...

  5. 深入分布式一致性:Raft 和 etcdRaft

    分布式一致性是构建可靠的分布式系统的关键要素之一.为了确保数据的一致性和可用性,一致性算法的设计变得至关重要.在这篇博文中,我们将深入探讨两个与分布式一致性密切相关的主题:Raft 算法和 etcdR ...

  6. Jmeter获取Websocket多帧消息的实现方法

         由于需要对WebSocket进行压力测试,因此又回归到了JMeter的使用.网络上缺少具体的获取多帧消息的操作,且自己也踩了两个坑,总结一下可行的操作供大家参考.   一.情况说明     ...

  7. js递归查询之根据id查询当前对象

    需求:递归查询数组中id对应的数据 Json数据格式: 1 let cityArr = [ 2 { 3 id: 1000, 4 name: '四川省', 5 children: [ 6 { 7 id: ...

  8. C#/.NET/.NET Core优秀项目和框架2023年9月简报

    前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(公众号每周至少推荐两个优秀的项目和框架当然节假日除外),公众号推文有项目和框架的介绍.功能特点以及部分截图等(打不开或 ...

  9. .netCore 图形验证码,非System.Drawing.Common

    netcore需要跨平台,说白点就是放在windows服务器要能用,放在linux服务器上也能用,甚至macos上. 很多时候需要使用到图形验证码,这就有问题了. 旧方案1.引入包 <Packa ...

  10. Swagger系列:SpringBoot3.x中使用Knife4j

    目录 一.简介 二.版本说明 三.使用 四.效果图 一.简介 官网:https://doc.xiaominfo.com/ Knife4j是一个集Swagger2 和 OpenAPI3 为一体的增强解决 ...