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<String> multiTableQueryName;
|
|
public void setMultiTableQueryName(List<String> 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<OrderItem> 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<ParameterMapping> mappings = mpBoundSql.parameterMappings();
|
Map<String, Object> 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();
|
}
|
|
|
|
}
|