Selaa lähdekoodia

逻辑删除,支持全update、select类型SQL自动添加逻辑删除字段,不仅仅是mp提供的api自动添加

willenfoo 7 vuotta sitten
vanhempi
commit
5c54e17704

+ 63 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/mapper/LogicAllSqlInjector.java

@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2011-2014, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.mapper;
+
+import com.baomidou.mybatisplus.entity.TableFieldInfo;
+import com.baomidou.mybatisplus.entity.TableInfo;
+import com.baomidou.mybatisplus.enums.SqlMethod;
+import com.baomidou.mybatisplus.toolkit.StringUtils;
+import org.apache.ibatis.mapping.SqlSource;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 逻辑删除,支持全update、select类型SQL自动添加逻辑删除字段,不仅仅是mp提供的api自动添加<br>
+ * 1、支持逻辑删除
+ * </p>
+ *
+ * @author hubin willenfoo
+ * @Date 2017-09-09
+ */
+public class LogicAllSqlInjector extends SuperLogicSqlInjector {
+
+    /**
+     * 根据 ID 删除
+     */
+    @Override
+    protected void injectDeleteByIdSql(boolean batch, Class<?> mapperClass, Class<?> modelClass, TableInfo table) {
+        super.injectDeleteByIdSql(batch, mapperClass, modelClass, table);
+    }
+
+    /**
+     * 根据 SQL 删除
+     */
+    @Override
+    protected void injectDeleteSql(Class<?> mapperClass, Class<?> modelClass, TableInfo table) {
+        super.injectDeleteSql(mapperClass, modelClass, table);
+    }
+
+    /**
+     * 根据 MAP 删除
+     */
+    @Override
+    protected void injectDeleteByMapSql(Class<?> mapperClass, TableInfo table) {
+        super.injectDeleteByMapSql(mapperClass, table);
+    }
+
+
+}

+ 4 - 72
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/mapper/LogicSqlInjector.java

@@ -36,34 +36,14 @@ import com.baomidou.mybatisplus.toolkit.StringUtils;
  * @author hubin willenfoo
  * @Date 2017-09-09
  */
-public class LogicSqlInjector extends AutoSqlInjector {
+public class LogicSqlInjector extends SuperLogicSqlInjector {
 
     /**
      * 根据 ID 删除
      */
     @Override
     protected void injectDeleteByIdSql(boolean batch, Class<?> mapperClass, Class<?> modelClass, TableInfo table) {
-        if (table.isLogicDelete()) {
-            // 逻辑删除注入
-            SqlMethod sqlMethod = SqlMethod.LOGIC_DELETE_BY_ID;
-            SqlSource sqlSource;
-            String idStr = table.getKeyProperty();
-            if (batch) {
-                sqlMethod = SqlMethod.LOGIC_DELETE_BATCH_BY_IDS;
-                StringBuilder ids = new StringBuilder();
-                ids.append("\n<foreach item=\"item\" index=\"index\" collection=\"coll\" separator=\",\">");
-                ids.append("#{item}");
-                ids.append("\n</foreach>");
-                idStr = ids.toString();
-            }
-            String sql = String.format(sqlMethod.getSql(), table.getTableName(), sqlLogicSet(table),
-                table.getKeyColumn(), idStr);
-            sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
-            this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
-        } else {
-            // 正常删除
-            super.injectDeleteByIdSql(batch, mapperClass, modelClass, table);
-        }
+        super.injectDeleteByIdSql(batch, mapperClass, modelClass, table);
     }
 
     /**
@@ -71,17 +51,7 @@ public class LogicSqlInjector extends AutoSqlInjector {
      */
     @Override
     protected void injectDeleteSql(Class<?> mapperClass, Class<?> modelClass, TableInfo table) {
-        if (table.isLogicDelete()) {
-            // 逻辑删除注入
-            SqlMethod sqlMethod = SqlMethod.LOGIC_DELETE;
-            String sql = String.format(sqlMethod.getSql(), table.getTableName(), sqlLogicSet(table),
-                sqlWhereEntityWrapper(table));
-            SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
-            this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
-        } else {
-            // 正常删除
-            super.injectDeleteSql(mapperClass, modelClass, table);
-        }
+        super.injectDeleteSql(mapperClass, modelClass, table);
     }
 
     /**
@@ -89,17 +59,7 @@ public class LogicSqlInjector extends AutoSqlInjector {
      */
     @Override
     protected void injectDeleteByMapSql(Class<?> mapperClass, TableInfo table) {
-        if (table.isLogicDelete()) {
-            // 逻辑删除注入
-            SqlMethod sqlMethod = SqlMethod.LOGIC_DELETE_BY_MAP;
-            String sql = String.format(sqlMethod.getSql(), table.getTableName(), sqlLogicSet(table),
-                sqlWhereByMap(table));
-            SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, Map.class);
-            this.addUpdateMappedStatement(mapperClass, Map.class, sqlMethod.getMethod(), sqlSource);
-        } else {
-            // 正常删除
-            super.injectDeleteByMapSql(mapperClass, table);
-        }
+        super.injectDeleteByMapSql(mapperClass, table);
     }
 
     /**
@@ -190,34 +150,6 @@ public class LogicSqlInjector extends AutoSqlInjector {
         return sql.toString();
     }
 
-    /**
-     * <p>
-     * SQL 更新 set 语句
-     * </p>
-     *
-     * @param table 表信息
-     * @return sql set 片段
-     */
-    protected String sqlLogicSet(TableInfo table) {
-        List<TableFieldInfo> fieldList = table.getFieldList();
-        StringBuilder set = new StringBuilder("SET ");
-        int i = 0;
-        for (TableFieldInfo fieldInfo : fieldList) {
-            if (fieldInfo.isLogicDelete()) {
-                if (++i > 1) {
-                    set.append(",");
-                }
-                set.append(fieldInfo.getColumn()).append("=");
-                if (StringUtils.isCharSequence(fieldInfo.getPropertyType())) {
-                    set.append("'").append(fieldInfo.getLogicDeleteValue()).append("'");
-                } else {
-                    set.append(fieldInfo.getLogicDeleteValue());
-                }
-            }
-        }
-        return set.toString();
-    }
-
     // ------------ 处理逻辑删除条件过滤 ------------
 
     @Override

+ 117 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/mapper/SuperLogicSqlInjector.java

@@ -0,0 +1,117 @@
+package com.baomidou.mybatisplus.mapper;
+
+import com.baomidou.mybatisplus.entity.TableFieldInfo;
+import com.baomidou.mybatisplus.entity.TableInfo;
+import com.baomidou.mybatisplus.enums.SqlMethod;
+import com.baomidou.mybatisplus.toolkit.StringUtils;
+import org.apache.ibatis.mapping.SqlSource;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 逻辑删除,公共父类,抽出来
+ * 支持全update、select类型SQL自动添加逻辑删除字段和mp提供的api自动添加的公共方法 <br>
+ * </p>
+ *
+ * @author hubin willenfoo
+ * @Date 2018-03-09
+ */
+public class SuperLogicSqlInjector extends AutoSqlInjector {
+
+    /**
+     * 根据 ID 删除
+     */
+    @Override
+    protected void injectDeleteByIdSql(boolean batch, Class<?> mapperClass, Class<?> modelClass, TableInfo table) {
+        if (table.isLogicDelete()) {
+            // 逻辑删除注入
+            SqlMethod sqlMethod = SqlMethod.LOGIC_DELETE_BY_ID;
+            SqlSource sqlSource;
+            String idStr = table.getKeyProperty();
+            if (batch) {
+                sqlMethod = SqlMethod.LOGIC_DELETE_BATCH_BY_IDS;
+                StringBuilder ids = new StringBuilder();
+                ids.append("\n<foreach item=\"item\" index=\"index\" collection=\"coll\" separator=\",\">");
+                ids.append("#{item}");
+                ids.append("\n</foreach>");
+                idStr = ids.toString();
+            }
+            String sql = String.format(sqlMethod.getSql(), table.getTableName(), sqlLogicSet(table),
+                table.getKeyColumn(), idStr);
+            sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
+            this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
+        } else {
+            // 正常删除
+            super.injectDeleteByIdSql(batch, mapperClass, modelClass, table);
+        }
+    }
+
+    /**
+     * 根据 SQL 删除
+     */
+    @Override
+    protected void injectDeleteSql(Class<?> mapperClass, Class<?> modelClass, TableInfo table) {
+        if (table.isLogicDelete()) {
+            // 逻辑删除注入
+            SqlMethod sqlMethod = SqlMethod.LOGIC_DELETE;
+            String sql = String.format(sqlMethod.getSql(), table.getTableName(), sqlLogicSet(table),
+                sqlWhereEntityWrapper(table));
+            SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
+            this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
+        } else {
+            // 正常删除
+            super.injectDeleteSql(mapperClass, modelClass, table);
+        }
+    }
+
+    /**
+     * 根据 MAP 删除
+     */
+    @Override
+    protected void injectDeleteByMapSql(Class<?> mapperClass, TableInfo table) {
+        if (table.isLogicDelete()) {
+            // 逻辑删除注入
+            SqlMethod sqlMethod = SqlMethod.LOGIC_DELETE_BY_MAP;
+            String sql = String.format(sqlMethod.getSql(), table.getTableName(), sqlLogicSet(table),
+                sqlWhereByMap(table));
+            SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, Map.class);
+            this.addUpdateMappedStatement(mapperClass, Map.class, sqlMethod.getMethod(), sqlSource);
+        } else {
+            // 正常删除
+            super.injectDeleteByMapSql(mapperClass, table);
+        }
+    }
+
+    /**
+     * <p>
+     * SQL 更新 set 语句
+     * </p>
+     *
+     * @param table 表信息
+     * @return sql set 片段
+     */
+    protected String sqlLogicSet(TableInfo table) {
+        List<TableFieldInfo> fieldList = table.getFieldList();
+        StringBuilder set = new StringBuilder("SET ");
+        int i = 0;
+        for (TableFieldInfo fieldInfo : fieldList) {
+            if (fieldInfo.isLogicDelete()) {
+                if (++i > 1) {
+                    set.append(",");
+                }
+                set.append(fieldInfo.getColumn()).append("=");
+                if (StringUtils.isCharSequence(fieldInfo.getPropertyType())) {
+                    set.append("'").append(fieldInfo.getLogicDeleteValue()).append("'");
+                } else {
+                    set.append(fieldInfo.getLogicDeleteValue());
+                }
+            }
+        }
+        return set.toString();
+    }
+
+
+
+}

+ 81 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/plugins/parser/logicdelete/LogicDeleteDefaultHandler.java

@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2011-2020, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.plugins.parser.logicdelete;
+
+import com.baomidou.mybatisplus.entity.TableFieldInfo;
+import com.baomidou.mybatisplus.entity.TableInfo;
+import com.baomidou.mybatisplus.toolkit.TableInfoHelper;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.LongValue;
+import net.sf.jsqlparser.expression.StringValue;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * <p>
+ * 逻辑删除处理器
+ * </p>
+ *
+ * @author willenfoo
+ * @since 2018-03-09
+ */
+public class LogicDeleteDefaultHandler implements LogicDeleteHandler {
+
+    private static final Map<String, TableFieldInfo> tableLogicDeleteMap = new ConcurrentHashMap<String, TableFieldInfo>();
+
+    public LogicDeleteDefaultHandler() {
+        init();
+    }
+
+    private void init() {
+        if (tableLogicDeleteMap.isEmpty()) {
+            List<TableInfo> tableInfos = TableInfoHelper.getTableInfos();
+            for (TableInfo tableInfo : tableInfos) {
+                List<TableFieldInfo> tableFieldInfos = tableInfo.getFieldList();
+                for (TableFieldInfo tableFieldInfo: tableFieldInfos) {
+                    if (tableFieldInfo.isLogicDelete()) {
+                        tableLogicDeleteMap.put(tableInfo.getTableName(), tableFieldInfo);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public Expression getValue(String tableName) {
+        init();
+        if (String.class.equals(tableLogicDeleteMap.get(tableName).getPropertyType())) {
+            return new StringValue(tableLogicDeleteMap.get(tableName).getLogicNotDeleteValue());
+        } else {
+            return new LongValue(tableLogicDeleteMap.get(tableName).getLogicNotDeleteValue());
+        }
+    }
+
+    @Override
+    public String getColumn(String tableName) {
+        init();
+        return tableLogicDeleteMap.get(tableName).getColumn();
+    }
+
+    @Override
+    public boolean doTableFilter(String tableName) {
+        init();
+        return !tableLogicDeleteMap.containsKey(tableName);
+    }
+}

+ 35 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/plugins/parser/logicdelete/LogicDeleteHandler.java

@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) 2011-2020, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.plugins.parser.logicdelete;
+
+import net.sf.jsqlparser.expression.Expression;
+
+/**
+ * <p>
+ * 逻辑删除处理器
+ * </p>
+ *
+ * @author willenfoo
+ * @since 2018-03-09
+ */
+public interface LogicDeleteHandler {
+
+    Expression getValue(String tableName);
+
+    String getColumn(String tableName);
+
+    boolean doTableFilter(String tableName);
+}

+ 268 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/plugins/parser/logicdelete/LogicDeleteSqlParser.java

@@ -0,0 +1,268 @@
+/**
+ * Copyright (c) 2011-2020, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.plugins.parser.logicdelete;
+
+import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.plugins.parser.AbstractJsqlParser;
+import net.sf.jsqlparser.expression.BinaryExpression;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
+import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.delete.Delete;
+import net.sf.jsqlparser.statement.insert.Insert;
+import net.sf.jsqlparser.statement.select.*;
+import net.sf.jsqlparser.statement.update.Update;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 逻辑删除 SQL 解析
+ * </p>
+ *
+ * @author willenfoo
+ * @since 2018-03-09
+ */
+public class LogicDeleteSqlParser extends AbstractJsqlParser {
+
+    private LogicDeleteHandler logicDeleteHandler = new LogicDeleteDefaultHandler();
+
+    /**
+     * select 语句处理
+     */
+    @Override
+    public void processSelectBody(SelectBody selectBody) {
+        if (selectBody instanceof PlainSelect) {
+            processPlainSelect((PlainSelect) selectBody);
+        } else if (selectBody instanceof WithItem) {
+            WithItem withItem = (WithItem) selectBody;
+            if (withItem.getSelectBody() != null) {
+                processSelectBody(withItem.getSelectBody());
+            }
+        } else {
+            SetOperationList operationList = (SetOperationList) selectBody;
+            if (operationList.getSelects() != null && operationList.getSelects().size() > 0) {
+                List<SelectBody> plainSelects = operationList.getSelects();
+                for (SelectBody plainSelect : plainSelects) {
+                    processSelectBody(plainSelect);
+                }
+            }
+        }
+    }
+
+    /**
+     * <p>
+     * insert 语句处理
+     * </p>
+     */
+    @Override
+    public void processInsert(Insert insert) {
+
+    }
+
+    /**
+     * <p>
+     * update 语句处理
+     * </p>
+     */
+    @Override
+    public void processUpdate(Update update) {
+        List<Table> tableList = update.getTables();
+        if (null == tableList || tableList.size() >= 2) {
+            throw new MybatisPlusException("Failed to process multiple-table update, please exclude the statementId");
+        }
+        Table table = tableList.get(0);
+        if (this.logicDeleteHandler.doTableFilter(table.getName())) {
+            // 过滤退出执行
+            return;
+        }
+        update.setWhere(this.andExpression(table, update.getWhere()));
+        List<Join> joins = update.getJoins();
+        if (joins != null && joins.size() > 0) {
+            for (Join join : joins) {
+                processJoin(join);
+                processFromItem(join.getRightItem());
+            }
+        }
+    }
+
+    /**
+     * <p>
+     * delete 语句处理
+     * </p>
+     */
+    @Override
+    public void processDelete(Delete delete) {
+
+    }
+
+    /**
+     * <p>
+     * select update 语句 where 处理
+     * </p>
+     */
+    protected BinaryExpression andExpression(Table table, Expression where) {
+        //获得where条件表达式
+        EqualsTo equalsTo = new EqualsTo();
+        if (null != where) {
+            equalsTo.setLeftExpression(new Column(this.logicDeleteHandler.getColumn(table.getName())));
+            equalsTo.setRightExpression(logicDeleteHandler.getValue(table.getName()));
+            return new AndExpression(where, equalsTo);
+        }
+        equalsTo.setLeftExpression(this.getAliasColumn(table));
+        equalsTo.setRightExpression(logicDeleteHandler.getValue(table.getName()));
+        return equalsTo;
+    }
+
+    /**
+     * <p>
+     * 处理 PlainSelect
+     * </p>
+     */
+    protected void processPlainSelect(PlainSelect plainSelect) {
+        processPlainSelect(plainSelect, false);
+    }
+
+    /**
+     * <p>
+     * 处理 PlainSelect
+     * </p>
+     *
+     * @param plainSelect
+     * @param addColumn   是否添加逻辑删除列
+     */
+    protected void processPlainSelect(PlainSelect plainSelect, boolean addColumn) {
+        FromItem fromItem = plainSelect.getFromItem();
+        if (fromItem instanceof Table) {
+            Table fromTable = (Table) fromItem;
+            if (this.logicDeleteHandler.doTableFilter(fromTable.getName())) {
+                // 过滤退出执行
+                return;
+            }
+            plainSelect.setWhere(builderExpression(plainSelect.getWhere(), fromTable));
+            if (addColumn) {
+                plainSelect.getSelectItems().add(new SelectExpressionItem(new Column(this.logicDeleteHandler.getColumn(fromTable.getName()))));
+            }
+        } else {
+            processFromItem(fromItem);
+        }
+        List<Join> joins = plainSelect.getJoins();
+        if (joins != null && joins.size() > 0) {
+            for (Join join : joins) {
+                processJoin(join);
+                processFromItem(join.getRightItem());
+            }
+        }
+    }
+
+    /**
+     * 处理子查询等
+     */
+    protected void processFromItem(FromItem fromItem) {
+        if (fromItem instanceof SubJoin) {
+            SubJoin subJoin = (SubJoin) fromItem;
+            if (subJoin.getJoin() != null) {
+                processJoin(subJoin.getJoin());
+            }
+            if (subJoin.getLeft() != null) {
+                processFromItem(subJoin.getLeft());
+            }
+        } else if (fromItem instanceof SubSelect) {
+            SubSelect subSelect = (SubSelect) fromItem;
+            if (subSelect.getSelectBody() != null) {
+                processSelectBody(subSelect.getSelectBody());
+            }
+        } else if (fromItem instanceof ValuesList) {
+            logger.debug("Perform a subquery, if you do not give us feedback");
+        } else if (fromItem instanceof LateralSubSelect) {
+            LateralSubSelect lateralSubSelect = (LateralSubSelect) fromItem;
+            if (lateralSubSelect.getSubSelect() != null) {
+                SubSelect subSelect = lateralSubSelect.getSubSelect();
+                if (subSelect.getSelectBody() != null) {
+                    processSelectBody(subSelect.getSelectBody());
+                }
+            }
+        }
+    }
+
+    /**
+     * 处理联接语句
+     */
+    protected void processJoin(Join join) {
+        if (join.getRightItem() instanceof Table) {
+            Table fromTable = (Table) join.getRightItem();
+            if (this.logicDeleteHandler.doTableFilter(fromTable.getName())) {
+                // 过滤退出执行
+                return;
+            }
+            join.setOnExpression(builderExpression(join.getOnExpression(), fromTable));
+        }
+    }
+
+    /**
+     * 处理条件
+     */
+    protected Expression builderExpression(Expression expression, Table table) {
+        //生成字段名
+        EqualsTo equalsTo = new EqualsTo();
+        equalsTo.setLeftExpression(this.getAliasColumn(table));
+        equalsTo.setRightExpression(logicDeleteHandler.getValue(table.getName()));
+        //加入判断防止条件为空时生成 "and null" 导致查询结果为空
+        if (expression == null) {
+            return equalsTo;
+        } else {
+            if (expression instanceof BinaryExpression) {
+                BinaryExpression binaryExpression = (BinaryExpression) expression;
+                if (binaryExpression.getLeftExpression() instanceof FromItem) {
+                    processFromItem((FromItem) binaryExpression.getLeftExpression());
+                }
+                if (binaryExpression.getRightExpression() instanceof FromItem) {
+                    processFromItem((FromItem) binaryExpression.getRightExpression());
+                }
+            }
+            return new AndExpression(expression, equalsTo);
+        }
+    }
+
+    /**
+     * <p>
+     * 字段是否添加别名设置
+     * </p>
+     *
+     * @param table 表对象
+     * @return 字段
+     */
+    protected Column getAliasColumn(Table table) {
+        if (null == table.getAlias()) {
+            return new Column(this.logicDeleteHandler.getColumn(table.getName()));
+        }
+        StringBuilder column = new StringBuilder();
+        column.append(table.getAlias().getName());
+        column.append(".");
+        column.append(this.logicDeleteHandler.getColumn(table.getName()));
+        return new Column(column.toString());
+    }
+
+    public LogicDeleteHandler getLogicDeleteHandler() {
+        return logicDeleteHandler;
+    }
+
+    public void setLogicDeleteHandler(LogicDeleteHandler logicDeleteHandler) {
+        this.logicDeleteHandler = logicDeleteHandler;
+    }
+}

+ 101 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/test/sql/LogicDeleteAllSqlTest.java

@@ -0,0 +1,101 @@
+package com.baomidou.mybatisplus.test.sql;
+
+import com.baomidou.mybatisplus.plugins.parser.SqlInfo;
+import com.baomidou.mybatisplus.plugins.parser.logicdelete.LogicDeleteHandler;
+import com.baomidou.mybatisplus.plugins.parser.logicdelete.LogicDeleteSqlParser;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.StringValue;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * <p>
+ * 逻辑删除 全SQL 测试
+ * </p>
+ *
+ * @author willenfoo
+ * @since 2018-03-09
+ */
+public class LogicDeleteAllSqlTest {
+
+    private LogicDeleteSqlParser tenantSqlParser;
+
+    @Before
+    public void setUp() throws Exception {
+        tenantSqlParser = new LogicDeleteSqlParser();
+        tenantSqlParser.setLogicDeleteHandler(new LogicDeleteHandler() {
+
+            @Override
+            public Expression getValue(String tableName) {
+                return new StringValue("N");
+            }
+
+            @Override
+            public String getColumn(String tableName) {
+                return "delete_flag";
+            }
+
+            @Override
+            public boolean doTableFilter(String tableName) {
+                return false;
+            }
+        });
+    }
+
+    // ----------------------------    update 测试     ----------------------------
+    @Test
+    public void updateFilter() {
+        SqlInfo sqlInfo = tenantSqlParser.optimizeSql(null, "UPDATE user set c1='as', c2=?, c3=565 Where o >= 3");
+        Assert.assertEquals("UPDATE user SET c1 = 'as', c2 = ?, c3 = 565 WHERE o >= 3 AND delete_flag = 'N'", sqlInfo.getSql());
+    }
+
+    @Test
+    public void updateSet() {
+        SqlInfo sqlInfo = tenantSqlParser.optimizeSql(null, "UPDATE role set c1='as', c2=?, c3=565 Where o >= 3");
+        Assert.assertEquals("UPDATE role SET c1 = 'as', c2 = ?, c3 = 565 WHERE o >= 3 AND delete_flag = 'N'", sqlInfo.getSql());
+    }
+
+    @Test
+    public void updateSetJoin() {
+        SqlInfo sqlInfo = tenantSqlParser.optimizeSql(null, "UPDATE role r SET r.c1 = 5 FROM role LEFT JOIN user u ON r.c1 = u.c2 Where o >= 3");
+        Assert.assertEquals("UPDATE role r SET r.c1 = 5 FROM role LEFT JOIN user u ON r.c1 = u.c2 AND u.delete_flag = 'N' WHERE o >= 3 AND delete_flag = 'N'", sqlInfo.getSql());
+    }
+
+    // ----------------------------    select 测试     ----------------------------
+    @Test
+    public void selectFilter() {
+        SqlInfo sqlInfo = tenantSqlParser.optimizeSql(null, "select * from user");
+        Assert.assertEquals("SELECT * FROM user WHERE delete_flag = 'N'", sqlInfo.getSql());
+    }
+
+    @Test
+    public void selectFilter1() {
+        SqlInfo sqlInfo = tenantSqlParser.optimizeSql(null, "select u.name,r.id FROM user u, role r");
+        Assert.assertEquals("SELECT u.name, r.id FROM user u, role r WHERE u.delete_flag = 'N'", sqlInfo.getSql());
+    }
+
+    @Test
+    public void selectChild() {
+        SqlInfo sqlInfo = tenantSqlParser.optimizeSql(null, "select aaa, bbb,(select ccc from user) as ccc from role");
+        Assert.assertEquals("SELECT aaa, bbb, (SELECT ccc FROM user) AS ccc FROM role WHERE delete_flag = 'N'", sqlInfo.getSql());
+    }
+
+    @Test
+    public void selectChild1() {
+        SqlInfo sqlInfo = tenantSqlParser.optimizeSql(null, "select name from role where  id= (select rid from user where id=1 )");
+        Assert.assertEquals("SELECT name FROM role WHERE id = (SELECT rid FROM user WHERE id = 1 AND delete_flag = 'N') AND delete_flag = 'N'", sqlInfo.getSql());
+    }
+
+    @Test
+    public void selectJoin() {
+        SqlInfo sqlInfo = tenantSqlParser.optimizeSql(null, "SELECT u.aaa, r.bbb FROM role r left JOIN user u WHERE r.id=u.id");
+        Assert.assertEquals("SELECT u.aaa, r.bbb FROM role r LEFT JOIN user u ON u.delete_flag = 'N' WHERE r.id = u.id AND r.delete_flag = 'N'", sqlInfo.getSql());
+    }
+
+    @Test
+    public void selectJoin1() {
+        SqlInfo sqlInfo = tenantSqlParser.optimizeSql(null, "SELECT u.aaa, r.bbb FROM role r LEFT JOIN user u ON r.id=u.id LEFT JOIN teacher t ON r.id=t.id ");
+        Assert.assertEquals("SELECT u.aaa, r.bbb FROM role r LEFT JOIN user u ON r.id = u.id AND u.delete_flag = 'N' LEFT JOIN teacher t ON r.id = t.id AND t.delete_flag = 'N' WHERE r.delete_flag = 'N'", sqlInfo.getSql());
+    }
+}