package com.moral.api.config.mybatis; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ParameterUtils; import com.baomidou.mybatisplus.core.toolkit.PluginUtils; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.pagination.DialectModel; import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.IDialect; import lombok.SneakyThrows; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.select.*; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.ParameterMapping; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import java.sql.SQLException; import java.util.List; import java.util.Map; /** * @ClassName * @Description TODO * @Author 陈凯裕 * @Date 2021/9/18 10:13 * @Version TODO **/ public class PaginationInnerInterceptorIIL extends PaginationInnerInterceptor { private List multiTableQueryName; public void setMultiTableQueryName(List multiTableQueryName) { this.multiTableQueryName = multiTableQueryName; } public PaginationInnerInterceptorIIL(DbType dbType) { super(dbType); } @SneakyThrows @Override public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { IPage page = ParameterUtils.findPage(parameter).orElse(null); if (null == page) { return; } // 处理 orderBy 拼接 boolean addOrdered = false; String buildSql = boundSql.getSql(); List orders = page.orders(); if (!CollectionUtils.isEmpty(orders)) { addOrdered = true; buildSql = this.concatOrderBy(buildSql, orders); } // size 小于 0 不构造分页sql if (page.getSize() < 0) { if (addOrdered) { PluginUtils.mpBoundSql(boundSql).sql(buildSql); } return; } handlerLimit(page); IDialect dialect = findIDialect(executor); //判断表名是否需要分表查询 String tableName = getTableName(buildSql); if(multiTableQueryName.contains(tableName)){ System.out.println(111); } final Configuration configuration = ms.getConfiguration(); DialectModel model = dialect.buildPaginationSql(buildSql, page.offset(), page.getSize()); PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql); List mappings = mpBoundSql.parameterMappings(); Map additionalParameter = mpBoundSql.additionalParameters(); model.consumers(mappings, configuration, additionalParameter); mpBoundSql.sql(model.getDialectSql()); mpBoundSql.parameterMappings(mappings); } private String getTableName(String buildSql) throws JSQLParserException { Select select = (Select) CCJSqlParserUtil.parse(buildSql); PlainSelect selectBody = (PlainSelect) select.getSelectBody(); Table table = (Table) selectBody.getFromItem(); return table.getName(); } }