Mybatis数据隔离,摆脱注解束缚,实现简单到令人惊叹,究竟有多简单?

更新于
2026-09-12 04:11:46
27阅读来源:SEO资源
  • 内容介绍
  • 文章标签
  • 相关问答

一、项目中绕不开的话题,“数据隔离”

在做管理程序时一定绕不开“数据隔离”这个场景

Mybatis数据隔离,摆脱注解束缚,实现简单到令人惊叹,究竟有多简单?
  • 租户A只能看到A产生的数据
  • 订单数据。后台能看自己组织下的所有订单,但是到了C端,每个人只能看到自己的订单

二、常规做法让人崩溃!手动维护成本高

  • 自己sql中去拼筛选条件 每个SQL手动拼接WHERE条件?太原始了,代码重复率爆表!

    Mybatis数据隔离,摆脱注解束缚,实现简单到令人惊叹,究竟有多简单?
  • 封装一个注解。每个需要的接口标注一下 看似优雅,但依然要@DataIsolation到处粘贴!维护成本依然高企,

  • 两种方式本质相同:业务代码必须主动参与隔离逻辑实现!这根本不是“隔离”该有的样子!

再看痛点。开发者应该专注业务逻辑,而不是反复处理重复代码!

三、了解一下Sangsang框架:彻底解放双手的MyBatis数据隔离方案🚀

一款专为 Java 开发者建立的透明数据中间层框架。基于Mybatis拦截器。它的主要原则只有一条:

从主要理念来看,全局规则统一配置🚀

  • 数据隔离应该是一个很单纯的场景,同一种数据在全局的数据隔离规则都是一样的
  • 这个规则应该是适用于全局的,而不是需要在每个接口都要去实现一套这个逻辑
  • 我们其实也不需要每个接口,每个sql进行标注了,仅需全局配置一次即可.

再看典型场景示例。订单程序对比🚀

传统方案 vs Sangsang方案
传统方案:后台+C端需要分别处理
Sangsang方案:全局规则配置一次即可
  • 后台程序
    • 根据组织ID过滤
    • 需在所有查询SQL手动添加WHERE org_id =?
    • 需判断当前使用者是否为管理员角色
  • C端程序
    • 根据使用者ID过滤
    • 需在所有查询SQL手动添加WHERE user_id =?不过,
配置文件的观点是。
sangsang.isolation.enable=true
sangsang.rules.order_table.condition=user_id if c_end else org_id
sangsang.rules.order_table.filter.user_id=${currentUser.id}
sangsang.rules.order_table.filter.org_id=${currentOrg.id}
sangsang.rules.order_table.role.admin=true

效果的观点是,- 后台自动过滤org_id
- C端自动过滤user_id
- 无需任何代码修改!/ td>
/ tr>
/ table>

技术原理揭秘🔍

创建业务表的人配置好这张表如何进行数据隔离后 框架会在SQL发送到数据库之前通过解析AST,自动在WHERE子句中织入隔离条件。后续使用这张表开发人员不用关心“数据隔离”这个概念。完全透明化,🎉🎉🎉

// 接下来:启用并配置 sangsang.scanEntityPackage=com.your.package.entity // 自定义实体类扫描包方法 sangsang.isolation.enable=true // 开启功能

// 然后:定义第一条策略 pre sangeong.rule.customertable.field tenantid pre / pre sangeong.rule.customertable.strategy equals pre / pre sangeong.rule.customertable.value ${loginUser.getTenantId} pre /


标签:注解

一、项目中绕不开的话题,“数据隔离”

在做管理程序时一定绕不开“数据隔离”这个场景

Mybatis数据隔离,摆脱注解束缚,实现简单到令人惊叹,究竟有多简单?
  • 租户A只能看到A产生的数据
  • 订单数据。后台能看自己组织下的所有订单,但是到了C端,每个人只能看到自己的订单

二、常规做法让人崩溃!手动维护成本高

  • 自己sql中去拼筛选条件 每个SQL手动拼接WHERE条件?太原始了,代码重复率爆表!

    Mybatis数据隔离,摆脱注解束缚,实现简单到令人惊叹,究竟有多简单?
  • 封装一个注解。每个需要的接口标注一下 看似优雅,但依然要@DataIsolation到处粘贴!维护成本依然高企,

  • 两种方式本质相同:业务代码必须主动参与隔离逻辑实现!这根本不是“隔离”该有的样子!

再看痛点。开发者应该专注业务逻辑,而不是反复处理重复代码!

三、了解一下Sangsang框架:彻底解放双手的MyBatis数据隔离方案🚀

一款专为 Java 开发者建立的透明数据中间层框架。基于Mybatis拦截器。它的主要原则只有一条:

从主要理念来看,全局规则统一配置🚀

  • 数据隔离应该是一个很单纯的场景,同一种数据在全局的数据隔离规则都是一样的
  • 这个规则应该是适用于全局的,而不是需要在每个接口都要去实现一套这个逻辑
  • 我们其实也不需要每个接口,每个sql进行标注了,仅需全局配置一次即可.

再看典型场景示例。订单程序对比🚀

传统方案 vs Sangsang方案
传统方案:后台+C端需要分别处理
Sangsang方案:全局规则配置一次即可
  • 后台程序
    • 根据组织ID过滤
    • 需在所有查询SQL手动添加WHERE org_id =?
    • 需判断当前使用者是否为管理员角色
  • C端程序
    • 根据使用者ID过滤
    • 需在所有查询SQL手动添加WHERE user_id =?不过,
配置文件的观点是。
sangsang.isolation.enable=true
sangsang.rules.order_table.condition=user_id if c_end else org_id
sangsang.rules.order_table.filter.user_id=${currentUser.id}
sangsang.rules.order_table.filter.org_id=${currentOrg.id}
sangsang.rules.order_table.role.admin=true

效果的观点是,- 后台自动过滤org_id
- C端自动过滤user_id
- 无需任何代码修改!/ td>
/ tr>
/ table>

技术原理揭秘🔍

创建业务表的人配置好这张表如何进行数据隔离后 框架会在SQL发送到数据库之前通过解析AST,自动在WHERE子句中织入隔离条件。后续使用这张表开发人员不用关心“数据隔离”这个概念。完全透明化,🎉🎉🎉

// 接下来:启用并配置 sangsang.scanEntityPackage=com.your.package.entity // 自定义实体类扫描包方法 sangsang.isolation.enable=true // 开启功能

// 然后:定义第一条策略 pre sangeong.rule.customertable.field tenantid pre / pre sangeong.rule.customertable.strategy equals pre / pre sangeong.rule.customertable.value ${loginUser.getTenantId} pre /


标签:注解