11package com .github .lybgeek .mybatisplus .tenant .parser ;
22
3- import com .baomidou .mybatisplus .core .toolkit .Assert ;
3+ import com .baomidou .mybatisplus .core .toolkit .CollectionUtils ;
44import com .baomidou .mybatisplus .core .toolkit .ExceptionUtils ;
5- import com .baomidou .mybatisplus .core .toolkit .StringPool ;
65import com .baomidou .mybatisplus .extension .plugins .tenant .TenantSqlParser ;
76import net .sf .jsqlparser .expression .*;
8- import net .sf .jsqlparser .expression .operators .conditional . AndExpression ;
9- import net .sf .jsqlparser .expression .operators .conditional . OrExpression ;
10- import net .sf .jsqlparser .expression .operators .relational .* ;
7+ import net .sf .jsqlparser .expression .operators .relational . ExpressionList ;
8+ import net .sf .jsqlparser .expression .operators .relational . ItemsList ;
9+ import net .sf .jsqlparser .expression .operators .relational .MultiExpressionList ;
1110import net .sf .jsqlparser .schema .Column ;
12- import net .sf .jsqlparser .schema .Table ;
13- import net .sf .jsqlparser .statement .delete .Delete ;
1411import net .sf .jsqlparser .statement .insert .Insert ;
15- import net .sf .jsqlparser .statement .select .*;
16- import net .sf .jsqlparser .statement .update .Update ;
12+ import net .sf .jsqlparser .statement .select .PlainSelect ;
13+ import net .sf .jsqlparser .statement .select .SelectExpressionItem ;
14+ import net .sf .jsqlparser .statement .select .SelectItem ;
15+ import net .sf .jsqlparser .statement .select .SubSelect ;
1716
1817import java .util .List ;
1918
2423 **/
2524public class CustomTenantSqlParser extends TenantSqlParser {
2625
27- /**
28- * select 语句处理
29- */
30- @ Override
31- public void processSelectBody (SelectBody selectBody ) {
32- if (selectBody instanceof PlainSelect ) {
33- processPlainSelect ((PlainSelect ) selectBody );
34- } else if (selectBody instanceof WithItem ) {
35- WithItem withItem = (WithItem ) selectBody ;
36- if (withItem .getSelectBody () != null ) {
37- processSelectBody (withItem .getSelectBody ());
38- }
39- } else {
40- SetOperationList operationList = (SetOperationList ) selectBody ;
41- if (operationList .getSelects () != null && operationList .getSelects ().size () > 0 ) {
42- operationList .getSelects ().forEach (this ::processSelectBody );
43- }
44- }
45- }
4626
4727 /**
4828 * insert 语句处理
@@ -53,10 +33,8 @@ public void processInsert(Insert insert) {
5333 // 过滤退出执行
5434 return ;
5535 }
56- for (Column column : insert .getColumns ()) {
57- if (column .getColumnName ().equals (getTenantHandler ().getTenantIdColumn ())){
58- return ;
59- }
36+ if (isAleadyExistTenantColumn (insert )) {
37+ return ;
6038 }
6139 insert .getColumns ().add (new Column (getTenantHandler ().getTenantIdColumn ()));
6240 if (insert .getSelect () != null ) {
@@ -75,51 +53,19 @@ public void processInsert(Insert insert) {
7553 }
7654
7755 /**
78- * update 语句处理
56+ * 判断是否存在租户id列字段
57+ * @param insert
58+ * @return 如果已经存在,则绕过不执行
7959 */
80- @ Override
81- public void processUpdate (Update update ) {
82- List <Table > tableList = update .getTables ();
83- Assert .isTrue (null != tableList && tableList .size () < 2 ,
84- "Failed to process multiple-table update, please exclude the statementId" );
85- Table table = tableList .get (0 );
86- if (getTenantHandler ().doTableFilter (table .getName ())) {
87- // 过滤退出执行
88- return ;
89- }
90- update .setWhere (this .andExpression (table , update .getWhere ()));
91- }
92-
93- /**
94- * delete 语句处理
95- */
96- @ Override
97- public void processDelete (Delete delete ) {
98- if (getTenantHandler ().doTableFilter (delete .getTable ().getName ())) {
99- // 过滤退出执行
100- return ;
60+ private boolean isAleadyExistTenantColumn (Insert insert ) {
61+ List <Column > columns = insert .getColumns ();
62+ if (CollectionUtils .isEmpty (columns )){
63+ return false ;
10164 }
102- delete .setWhere (this .andExpression (delete .getTable (), delete .getWhere ()));
65+ String tenantIdColumn = getTenantHandler ().getTenantIdColumn ();
66+ return columns .stream ().map (Column ::getColumnName ).anyMatch (tenantId -> tenantId .equals (tenantIdColumn ));
10367 }
10468
105- /**
106- * delete update 语句 where 处理
107- */
108- @ Override
109- protected BinaryExpression andExpression (Table table , Expression where ) {
110- //获得where条件表达式
111- EqualsTo equalsTo = new EqualsTo ();
112- equalsTo .setLeftExpression (this .getAliasColumn (table ));
113- equalsTo .setRightExpression (getTenantHandler ().getTenantId ());
114- if (null != where ) {
115- if (where instanceof OrExpression ) {
116- return new AndExpression (equalsTo , new Parenthesis (where ));
117- } else {
118- return new AndExpression (equalsTo , where );
119- }
120- }
121- return equalsTo ;
122- }
12369
12470 /***
12571 * 因为mybatis-plus自带的功能只会拼接left 、from和where后面的表或子查询添加租户id。
@@ -177,131 +123,6 @@ private void operateExpression(Expression expression){
177123
178124
179125
180- /**
181- * 处理 PlainSelect
182- *
183- * @param plainSelect ignore
184- * @param addColumn 是否添加租户列,insert into select语句中需要
185- */
186- @ Override
187- protected void processPlainSelect (PlainSelect plainSelect , boolean addColumn ) {
188- FromItem fromItem = plainSelect .getFromItem ();
189- if (fromItem instanceof Table ) {
190- Table fromTable = (Table ) fromItem ;
191- if (getTenantHandler ().doTableFilter (fromTable .getName ())) {
192- // 过滤退出执行
193- return ;
194- }
195- plainSelect .setWhere (builderExpression (plainSelect .getWhere (), fromTable ));
196- if (addColumn ) {
197- plainSelect .getSelectItems ().add (new SelectExpressionItem (new Column (getTenantHandler ().getTenantIdColumn ())));
198- }
199- } else {
200- processFromItem (fromItem );
201- }
202- List <Join > joins = plainSelect .getJoins ();
203- if (joins != null && joins .size () > 0 ) {
204- joins .forEach (j -> {
205- processJoin (j );
206- processFromItem (j .getRightItem ());
207- });
208- }
209- }
210126
211- /**
212- * 处理子查询等
213- */
214- @ Override
215- protected void processFromItem (FromItem fromItem ) {
216- if (fromItem instanceof SubJoin ) {
217- SubJoin subJoin = (SubJoin ) fromItem ;
218- if (subJoin .getJoinList () != null ) {
219- subJoin .getJoinList ().forEach (this ::processJoin );
220- }
221- if (subJoin .getLeft () != null ) {
222- processFromItem (subJoin .getLeft ());
223- }
224- } else if (fromItem instanceof SubSelect ) {
225- SubSelect subSelect = (SubSelect ) fromItem ;
226- if (subSelect .getSelectBody () != null ) {
227- processSelectBody (subSelect .getSelectBody ());
228- }
229- } else if (fromItem instanceof ValuesList ) {
230- logger .debug ("Perform a subquery, if you do not give us feedback" );
231- } else if (fromItem instanceof LateralSubSelect ) {
232- LateralSubSelect lateralSubSelect = (LateralSubSelect ) fromItem ;
233- if (lateralSubSelect .getSubSelect () != null ) {
234- SubSelect subSelect = lateralSubSelect .getSubSelect ();
235- if (subSelect .getSelectBody () != null ) {
236- processSelectBody (subSelect .getSelectBody ());
237- }
238- }
239- }
240- }
241-
242- /**
243- * 处理联接语句
244- */
245- @ Override
246- protected void processJoin (Join join ) {
247- if (join .getRightItem () instanceof Table ) {
248- Table fromTable = (Table ) join .getRightItem ();
249- if (this .getTenantHandler ().doTableFilter (fromTable .getName ())) {
250- // 过滤退出执行
251- return ;
252- }
253- join .setOnExpression (builderExpression (join .getOnExpression (), fromTable ));
254- }
255- }
256-
257- /**
258- * 处理条件
259- */
260- @ Override
261- protected Expression builderExpression (Expression expression , Table table ) {
262- //生成字段名
263- EqualsTo equalsTo = new EqualsTo ();
264- equalsTo .setLeftExpression (this .getAliasColumn (table ));
265- equalsTo .setRightExpression (getTenantHandler ().getTenantId ());
266- //加入判断防止条件为空时生成 "and null" 导致查询结果为空
267- if (expression == null ) {
268- return equalsTo ;
269- } else {
270- if (expression instanceof BinaryExpression ) {
271- BinaryExpression binaryExpression = (BinaryExpression ) expression ;
272- if (binaryExpression .getLeftExpression () instanceof FromItem ) {
273- processFromItem ((FromItem ) binaryExpression .getLeftExpression ());
274- }
275- if (binaryExpression .getRightExpression () instanceof FromItem ) {
276- processFromItem ((FromItem ) binaryExpression .getRightExpression ());
277- }
278- }
279- if (expression instanceof OrExpression ) {
280- return new AndExpression (equalsTo , new Parenthesis (expression ));
281- } else {
282- return new AndExpression (equalsTo , expression );
283- }
284- }
285- }
286-
287- /**
288- * 租户字段别名设置
289- * <p>tableName.tenantId 或 tableAlias.tenantId</p>
290- *
291- * @param table 表对象
292- * @return 字段
293- */
294- @ Override
295- protected Column getAliasColumn (Table table ) {
296- StringBuilder column = new StringBuilder ();
297- if (null == table .getAlias ()) {
298- column .append (table .getName ());
299- } else {
300- column .append (table .getAlias ().getName ());
301- }
302- column .append (StringPool .DOT );
303- column .append (getTenantHandler ().getTenantIdColumn ());
304- return new Column (column .toString ());
305- }
306127
307128}
0 commit comments