Skip to content

Commit abc0470

Browse files
committed
mybatis-plus多租户
1 parent 10591cf commit abc0470

File tree

3 files changed

+28
-206
lines changed

3 files changed

+28
-206
lines changed

springboot-mybatisplus-tenant/src/main/java/com/github/lybgeek/mybatisplus/common/model/BaseEntity.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import lombok.Setter;
66

77
import java.io.Serializable;
8-
import java.time.LocalDateTime;
8+
import java.util.Date;
99

1010
/**
1111
* Entity基类
@@ -25,10 +25,10 @@ public class BaseEntity implements Serializable
2525

2626
/** 创建时间 */
2727
@TableField(fill = FieldFill.INSERT)
28-
private LocalDateTime createDate;
28+
private Date createDate;
2929

3030
/** 创建者 */
31-
@TableField(fill = FieldFill.INSERT)
31+
@TableField(fill = FieldFill.INSERT)
3232
private String createdBy;
3333

3434
/** 创建者id */
@@ -45,7 +45,7 @@ public class BaseEntity implements Serializable
4545

4646
/** 更新时间 */
4747
@TableField(fill = FieldFill.INSERT_UPDATE)
48-
private LocalDateTime lastUpdateDate;
48+
private Date lastUpdateDate;
4949

5050
/** 版本号 */
5151
@Version

springboot-mybatisplus-tenant/src/main/java/com/github/lybgeek/mybatisplus/extension/metadata/MyMetaObjectHandler.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import org.apache.ibatis.reflection.MetaObject;
66
import org.springframework.stereotype.Component;
77

8-
import java.time.LocalDateTime;
8+
import java.util.Date;
99

1010
/**
1111
* 填充器
@@ -19,16 +19,17 @@ public class MyMetaObjectHandler implements MetaObjectHandler {
1919
@Override
2020
public void insertFill(MetaObject metaObject) {
2121
log.info("start insert fill ....");
22-
this.setInsertFieldValByName( "createDate", LocalDateTime.now(),metaObject);
23-
this.setInsertFieldValByName("lastUpdateDate", LocalDateTime.now(),metaObject);
22+
this.setInsertFieldValByName( "createDate", new Date(),metaObject);
23+
this.setInsertFieldValByName("lastUpdateDate", new Date(),metaObject);
2424
this.setInsertFieldValByName("createdBy", "lyb-geek",metaObject);
2525
this.setInsertFieldValByName( "lastUpdatedBy", "lyb-geek",metaObject);
26+
this.setInsertFieldValByName( "deleteFlag", 0,metaObject);
2627
}
2728

2829
@Override
2930
public void updateFill(MetaObject metaObject) {
3031
log.info("start update fill ....");
3132
this.setUpdateFieldValByName( "lastUpdatedBy", "admin",metaObject);
32-
this.setUpdateFieldValByName("lastUpdateDate", LocalDateTime.now(),metaObject);
33+
this.setUpdateFieldValByName("lastUpdateDate", new Date(),metaObject);
3334
}
3435
}
Lines changed: 19 additions & 198 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
package com.github.lybgeek.mybatisplus.tenant.parser;
22

3-
import com.baomidou.mybatisplus.core.toolkit.Assert;
3+
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
44
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
5-
import com.baomidou.mybatisplus.core.toolkit.StringPool;
65
import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
76
import 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;
1110
import net.sf.jsqlparser.schema.Column;
12-
import net.sf.jsqlparser.schema.Table;
13-
import net.sf.jsqlparser.statement.delete.Delete;
1411
import 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

1817
import java.util.List;
1918

@@ -24,25 +23,6 @@
2423
**/
2524
public 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

Comments
 (0)