From 70909ae10d752b4c1bd7c8ac9530531ef972119e Mon Sep 17 00:00:00 2001 From: xxxtea <1027449630@qq.com> Date: Wed, 5 Feb 2025 16:09:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A4=9A=E7=A7=9F=E6=88=B7=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E6=9F=A5=E8=AF=A2=E4=BD=BF=E7=94=A8=E7=B4=A2?= =?UTF-8?q?=E5=BC=95=E7=9A=84=E4=BC=98=E5=8C=96#6687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins/handler/TenantLineHandler.java | 12 ++++++++ .../inner/TenantLineInnerInterceptor.java | 14 +++++++++ .../inner/TenantLineInnerInterceptorTest.java | 29 +++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/main/java/com/baomidou/mybatisplus/extension/plugins/handler/TenantLineHandler.java b/mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/main/java/com/baomidou/mybatisplus/extension/plugins/handler/TenantLineHandler.java index f281cf07c..0dcacbfdd 100644 --- a/mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/main/java/com/baomidou/mybatisplus/extension/plugins/handler/TenantLineHandler.java +++ b/mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/main/java/com/baomidou/mybatisplus/extension/plugins/handler/TenantLineHandler.java @@ -47,6 +47,18 @@ default String getTenantIdColumn() { return "tenant_id"; } + /** + * where语句租户字段名是否前置 + *

+ * 默认为不前置 where id=? and name=? and tenant_id=? + * 前置,可以使用索引 where tenant_id=? and id=? and name=? + * + * @return 是否前置 + */ + default boolean tenantIdColumnFirst() { + return false; + } + /** * 根据表名判断是否忽略拼接多租户条件 *

diff --git a/mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptor.java b/mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptor.java index 525f9f71a..9ea9718a6 100644 --- a/mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptor.java +++ b/mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptor.java @@ -21,6 +21,8 @@ import com.baomidou.mybatisplus.extension.toolkit.PropertyMapper; import lombok.*; import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.operators.conditional.AndExpression; +import net.sf.jsqlparser.expression.operators.conditional.OrExpression; import net.sf.jsqlparser.expression.operators.relational.EqualsTo; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList; @@ -261,4 +263,16 @@ public Expression buildTableExpression(final Table table, final Expression where } return new EqualsTo(getAliasColumn(table), tenantLineHandler.getTenantId()); } + + @Override + public Expression builderExpression(Expression currentExpression, List tables, final String whereSegment) { + Expression expression = super.builderExpression(currentExpression, tables, whereSegment); + if (tenantLineHandler.tenantIdColumnFirst() && expression instanceof AndExpression) { + AndExpression andExpression = (AndExpression) expression; + Expression leftExpression = andExpression.getLeftExpression(); + andExpression.setLeftExpression(andExpression.getRightExpression()); + andExpression.setRightExpression(leftExpression); + } + return expression; + } } diff --git a/mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/test/java/com/baomidou/mybatisplus/test/extension/plugins/inner/TenantLineInnerInterceptorTest.java b/mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/test/java/com/baomidou/mybatisplus/test/extension/plugins/inner/TenantLineInnerInterceptorTest.java index 6a1c35196..45876b0f7 100644 --- a/mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/test/java/com/baomidou/mybatisplus/test/extension/plugins/inner/TenantLineInnerInterceptorTest.java +++ b/mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/test/java/com/baomidou/mybatisplus/test/extension/plugins/inner/TenantLineInnerInterceptorTest.java @@ -13,6 +13,7 @@ * @since 2020-07-30 */ class TenantLineInnerInterceptorTest { + private boolean tenantIdColumnFirst = false; private final TenantLineInnerInterceptor interceptor = new TenantLineInnerInterceptor(new TenantLineHandler() { private boolean ignoreFirst;// 需要执行 getTenantId 前必须先执行 ignoreTable @@ -29,6 +30,11 @@ public boolean ignoreTable(String tableName) { ignoreFirst = true; return tableName.startsWith("with_as"); } + + @Override + public boolean tenantIdColumnFirst() { + return tenantIdColumnFirst; + } }); @Test @@ -109,8 +115,31 @@ void selectSingle() { "SELECT * FROM entity u WHERE NOT (u.id = ? OR u.name = ?) AND u.tenant_id = 1"); } + @Test + void selectSingleTenantIdColumnFirst() { + tenantIdColumnFirst = true; + // 单表 + assertSql("select * from entity where id = ?", + "SELECT * FROM entity WHERE tenant_id = 1 AND id = ?"); + + assertSql("select * from entity where id = ? or name = ?", + "SELECT * FROM entity WHERE tenant_id = 1 AND (id = ? OR name = ?)"); + + assertSql("SELECT * FROM entity WHERE (id = ? OR name = ?)", + "SELECT * FROM entity WHERE tenant_id = 1 AND (id = ? OR name = ?)"); + + /* not */ + assertSql("SELECT * FROM entity WHERE not (id = ? OR name = ?)", + "SELECT * FROM entity WHERE tenant_id = 1 AND NOT (id = ? OR name = ?)"); + + assertSql("SELECT * FROM entity u WHERE not (u.id = ? OR u.name = ?)", + "SELECT * FROM entity u WHERE u.tenant_id = 1 AND NOT (u.id = ? OR u.name = ?)"); + tenantIdColumnFirst = false; + } + @Test void selectSubSelectIn() { + tenantIdColumnFirst = true; /* in */ assertSql("SELECT * FROM entity e WHERE e.id IN (select e1.id from entity1 e1 where e1.id = ?)", "SELECT * FROM entity e WHERE e.id IN (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");