From b55cb534c665af326e0148392c86fed85a13d3fa Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 17 Nov 2021 16:37:56 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=88=AB=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/metadata/MPJTableAliasHelper.java | 66 ------ .../core/metadata/MPJTableMapperHelper.java | 1 - .../yulichang/annotation/MPJTableAlias.java | 25 --- .../yulichang/config/InterceptorConfig.java | 17 +- .../yulichang/injector/MPJSqlInjector.java | 7 +- .../yulichang/method/MPJAbstractMethod.java | 12 +- .../yulichang/method/SelectJoinCount.java | 2 +- .../yulichang/method/SelectJoinList.java | 2 +- .../yulichang/method/SelectJoinMap.java | 2 +- .../yulichang/method/SelectJoinMaps.java | 2 +- .../yulichang/method/SelectJoinMapsPage.java | 2 +- .../yulichang/method/SelectJoinOne.java | 2 +- .../yulichang/method/SelectJoinPage.java | 2 +- .../query/MPJLambdaQueryWrapper.java | 28 +-- .../yulichang/query/MPJQueryWrapper.java | 23 +- .../github/yulichang/toolkit/Constant.java | 7 + .../wrapper/MPJAbstractLambdaWrapper.java | 31 ++- .../yulichang/wrapper/MPJAbstractWrapper.java | 83 +++++--- .../yulichang/wrapper/MPJLambdaWrapper.java | 199 +++++++++++++----- .../yulichang/wrapper/interfaces/Query.java | 17 -- .../wrapper/interfaces/on/OnCompare.java | 36 ++++ 21 files changed, 307 insertions(+), 259 deletions(-) delete mode 100644 src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableAliasHelper.java delete mode 100644 src/main/java/com/github/yulichang/annotation/MPJTableAlias.java diff --git a/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableAliasHelper.java b/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableAliasHelper.java deleted file mode 100644 index 654f347..0000000 --- a/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableAliasHelper.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.baomidou.mybatisplus.core.metadata; - -import com.baomidou.mybatisplus.core.toolkit.StringPool; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.github.yulichang.annotation.MPJTableAlias; -import com.github.yulichang.toolkit.Constant; -import lombok.Data; - -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * 全局表别名控制,默认表别名为 t t1 t2 ...
- * 可以通过@MPJTableAlias注解指定表别名
- * 仅对MPJLambdaWrapper有效 - * - * @author yulichang - * @see com.github.yulichang.wrapper.MPJLambdaWrapper - * @see MPJTableAlias - * @since 1.2.0 - */ -public class MPJTableAliasHelper { - - private static final Map, TableAlias> CACHE = new ConcurrentHashMap<>(); - - /** - * 用于生成别名的序号 - */ - private static final AtomicInteger index = new AtomicInteger(1); - - public static void init(Class clazz) { - TableAlias as = CACHE.get(clazz); - if (Objects.nonNull(as)) { - return; - } - TableAlias alias = new TableAlias(); - MPJTableAlias tableAlias = clazz.getAnnotation(MPJTableAlias.class); - if (tableAlias != null && StringUtils.isNotBlank(tableAlias.value())) { - alias.setAlias(tableAlias.value()); - } else { - alias.setAlias(Constant.TABLE_ALIAS + index.getAndIncrement()); - } - alias.setAliasDOT(alias.getAlias() + StringPool.DOT); - CACHE.put(clazz, alias); - } - - public static TableAlias get(Class clazz) { - return CACHE.get(clazz); - } - - @Data - public static class TableAlias { - /** - * 表别名 - */ - private String alias; - - /** - * 前缀 - */ - private String aliasDOT; - } - -} diff --git a/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableMapperHelper.java b/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableMapperHelper.java index 7df1a73..a7469d5 100644 --- a/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableMapperHelper.java +++ b/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableMapperHelper.java @@ -2,7 +2,6 @@ package com.baomidou.mybatisplus.core.metadata; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; /** * 实体类对应的mapper管理 diff --git a/src/main/java/com/github/yulichang/annotation/MPJTableAlias.java b/src/main/java/com/github/yulichang/annotation/MPJTableAlias.java deleted file mode 100644 index 0a5f067..0000000 --- a/src/main/java/com/github/yulichang/annotation/MPJTableAlias.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.github.yulichang.annotation; - -import java.lang.annotation.*; - -/** - * 关联查询时的表别名
- * 框架默认会随机生成 一般是 t1 t2 t3 ...
- * 不要在程序中使用随机别名,运行期间是不变的,但是重启就不一定了
- * 如需使用请配合此注解一起使用
- *

- * 这个注解定义的表别名或者随机生成的别名只对MPJLambdaWrapper生效
- * 对MPJQueryWrapper不生效, - * - * @author yulichang - * @see com.github.yulichang.wrapper.MPJLambdaWrapper - * @see com.github.yulichang.query.MPJQueryWrapper - * @since 1.2.0 - */ -@Documented -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE}) -public @interface MPJTableAlias { - - String value(); -} diff --git a/src/main/java/com/github/yulichang/config/InterceptorConfig.java b/src/main/java/com/github/yulichang/config/InterceptorConfig.java index deac6f0..af1cd0d 100644 --- a/src/main/java/com/github/yulichang/config/InterceptorConfig.java +++ b/src/main/java/com/github/yulichang/config/InterceptorConfig.java @@ -1,7 +1,9 @@ package com.github.yulichang.config; +import com.baomidou.mybatisplus.core.injector.ISqlInjector; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.github.yulichang.exception.MPJException; +import com.github.yulichang.injector.MPJSqlInjector; import com.github.yulichang.interceptor.MPJInterceptor; import org.apache.ibatis.logging.Log; import org.apache.ibatis.logging.LogFactory; @@ -31,6 +33,8 @@ public class InterceptorConfig implements ApplicationListener sqlSessionFactoryList; @Autowired private MPJInterceptor mpjInterceptor; + @Autowired(required = false) + private ISqlInjector iSqlInjector; @Override @SuppressWarnings("unchecked") @@ -44,16 +48,21 @@ public class InterceptorConfig implements ApplicationListener list = (List) interceptors.get(chain); - if (CollectionUtils.isNotEmpty(list) && list.get(list.size() - 1) != mpjInterceptor) { - list.removeIf(i -> i == mpjInterceptor); + if (CollectionUtils.isNotEmpty(list)) { + if (list.get(list.size() - 1) != mpjInterceptor) { + list.removeIf(i -> i == mpjInterceptor); + list.add(mpjInterceptor); + } + } else { list.add(mpjInterceptor); } } } catch (Exception ignored) { throw new MPJException("mpjInterceptor exception"); } - } else { - logger.warn("MPJ not define SqlSessionFactory"); + } + if (iSqlInjector != null && !(iSqlInjector instanceof MPJSqlInjector)) { + logger.error("sql注入器未继承 MPJSqlInjector -> " + iSqlInjector.getClass()); } } } diff --git a/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java b/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java index c928ea2..094c8d5 100644 --- a/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java +++ b/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java @@ -1,7 +1,11 @@ package com.github.yulichang.injector; +import com.baomidou.mybatisplus.core.MybatisConfiguration; +import com.baomidou.mybatisplus.core.config.GlobalConfig; import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.AbstractSqlInjector; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; +import com.baomidou.mybatisplus.core.injector.ISqlInjector; import com.baomidou.mybatisplus.core.injector.methods.*; import com.baomidou.mybatisplus.core.mapper.Mapper; import com.baomidou.mybatisplus.core.metadata.MPJTableMapperHelper; @@ -24,9 +28,10 @@ import static java.util.stream.Collectors.toList; * @author yulichang * @see DefaultSqlInjector */ -@ConditionalOnMissingBean(DefaultSqlInjector.class) +@ConditionalOnMissingBean({DefaultSqlInjector.class, AbstractSqlInjector.class, ISqlInjector.class}) public class MPJSqlInjector extends DefaultSqlInjector { + /** * 升级到 mybatis plus 3.4.3.2 后对之前的版本兼容 */ diff --git a/src/main/java/com/github/yulichang/method/MPJAbstractMethod.java b/src/main/java/com/github/yulichang/method/MPJAbstractMethod.java index e40254d..4417285 100644 --- a/src/main/java/com/github/yulichang/method/MPJAbstractMethod.java +++ b/src/main/java/com/github/yulichang/method/MPJAbstractMethod.java @@ -1,10 +1,10 @@ package com.github.yulichang.method; import com.baomidou.mybatisplus.core.injector.AbstractMethod; -import com.baomidou.mybatisplus.core.metadata.MPJTableAliasHelper; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; +import com.github.yulichang.toolkit.Constant; import java.util.ArrayList; import java.util.List; @@ -40,7 +40,7 @@ public abstract class MPJAbstractMethod extends AbstractMethod { String[] columns = selectColumns.split(StringPool.COMMA); List selectColumnList = new ArrayList<>(); for (String c : columns) { - selectColumnList.add(MPJTableAliasHelper.get(table.getEntityType()).getAlias() + StringPool.DOT + c); + selectColumnList.add(Constant.TABLE_ALIAS + StringPool.DOT + c); } selectColumns = String.join(StringPool.COMMA, selectColumnList); } @@ -54,18 +54,16 @@ public abstract class MPJAbstractMethod extends AbstractMethod { @Override protected String sqlCount() { return SqlScriptUtils.convertChoose(String.format("%s != null and %s != null and %s != ''", WRAPPER, - Q_WRAPPER_SQL_SELECT, Q_WRAPPER_SQL_SELECT), + Q_WRAPPER_SQL_SELECT, Q_WRAPPER_SQL_SELECT), SqlScriptUtils.unSafeParam(Q_WRAPPER_SQL_SELECT), ASTERISK); } - protected String sqlAlias(Class modelClass) { - return SqlScriptUtils.convertChoose(String.format("%s != null and %s != ''", "ew.autoAlias", "ew.autoAlias"), - MPJTableAliasHelper.get(modelClass).getAlias(), "${ew.alias}"); + protected String sqlAlias() { + return SqlScriptUtils.convertIf("${ew.alias}", String.format("%s != null and %s != ''", "ew.alias", "ew.alias"), false); } protected String sqlFrom() { return SqlScriptUtils.convertIf("${ew.from}", String.format("%s != null and %s != ''", "ew.from", "ew.from"), false); } - } diff --git a/src/main/java/com/github/yulichang/method/SelectJoinCount.java b/src/main/java/com/github/yulichang/method/SelectJoinCount.java index c45a010..628d277 100644 --- a/src/main/java/com/github/yulichang/method/SelectJoinCount.java +++ b/src/main/java/com/github/yulichang/method/SelectJoinCount.java @@ -17,7 +17,7 @@ public class SelectJoinCount extends MPJAbstractMethod { public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_COUNT; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlCount(), - tableInfo.getTableName(), sqlAlias(modelClass), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + tableInfo.getTableName(), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Integer.class); } diff --git a/src/main/java/com/github/yulichang/method/SelectJoinList.java b/src/main/java/com/github/yulichang/method/SelectJoinList.java index dc1452d..6918275 100644 --- a/src/main/java/com/github/yulichang/method/SelectJoinList.java +++ b/src/main/java/com/github/yulichang/method/SelectJoinList.java @@ -15,7 +15,7 @@ public class SelectJoinList extends MPJAbstractMethod { public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_LIST; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlSelectColumns(tableInfo, true), - tableInfo.getTableName(), sqlAlias(modelClass), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + tableInfo.getTableName(), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, MPJResultType.class); } diff --git a/src/main/java/com/github/yulichang/method/SelectJoinMap.java b/src/main/java/com/github/yulichang/method/SelectJoinMap.java index c457b20..efffa5f 100644 --- a/src/main/java/com/github/yulichang/method/SelectJoinMap.java +++ b/src/main/java/com/github/yulichang/method/SelectJoinMap.java @@ -17,7 +17,7 @@ public class SelectJoinMap extends MPJAbstractMethod { public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_MAP; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlSelectColumns(tableInfo, true), - tableInfo.getTableName(), sqlAlias(modelClass), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + tableInfo.getTableName(), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class); } diff --git a/src/main/java/com/github/yulichang/method/SelectJoinMaps.java b/src/main/java/com/github/yulichang/method/SelectJoinMaps.java index 5445852..9aa3ca7 100644 --- a/src/main/java/com/github/yulichang/method/SelectJoinMaps.java +++ b/src/main/java/com/github/yulichang/method/SelectJoinMaps.java @@ -17,7 +17,7 @@ public class SelectJoinMaps extends MPJAbstractMethod { public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_MAPS; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlSelectColumns(tableInfo, true), - tableInfo.getTableName(), sqlAlias(modelClass), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + tableInfo.getTableName(), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class); } diff --git a/src/main/java/com/github/yulichang/method/SelectJoinMapsPage.java b/src/main/java/com/github/yulichang/method/SelectJoinMapsPage.java index 5bb24b8..2ca6219 100644 --- a/src/main/java/com/github/yulichang/method/SelectJoinMapsPage.java +++ b/src/main/java/com/github/yulichang/method/SelectJoinMapsPage.java @@ -17,7 +17,7 @@ public class SelectJoinMapsPage extends MPJAbstractMethod { public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_MAPS_PAGE; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlSelectColumns(tableInfo, true), - tableInfo.getTableName(), sqlAlias(modelClass), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + tableInfo.getTableName(), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class); } diff --git a/src/main/java/com/github/yulichang/method/SelectJoinOne.java b/src/main/java/com/github/yulichang/method/SelectJoinOne.java index 93c2728..3d37df4 100644 --- a/src/main/java/com/github/yulichang/method/SelectJoinOne.java +++ b/src/main/java/com/github/yulichang/method/SelectJoinOne.java @@ -15,7 +15,7 @@ public class SelectJoinOne extends MPJAbstractMethod { public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_ONE; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlSelectColumns(tableInfo, true), - tableInfo.getTableName(), sqlAlias(modelClass), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + tableInfo.getTableName(), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, MPJResultType.class); } diff --git a/src/main/java/com/github/yulichang/method/SelectJoinPage.java b/src/main/java/com/github/yulichang/method/SelectJoinPage.java index 44d8d11..0f9a03b 100644 --- a/src/main/java/com/github/yulichang/method/SelectJoinPage.java +++ b/src/main/java/com/github/yulichang/method/SelectJoinPage.java @@ -15,7 +15,7 @@ public class SelectJoinPage extends MPJAbstractMethod { public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_PAGE; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlSelectColumns(tableInfo, true), - tableInfo.getTableName(), sqlAlias(modelClass), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + tableInfo.getTableName(), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, MPJResultType.class); } diff --git a/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java b/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java index ad949f6..22f355f 100644 --- a/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java +++ b/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java @@ -50,7 +50,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper extends AbstractLambdaWrapper alias(String tableAlias) { - this.alias = tableAlias; - return typedThis; - } - /** * SELECT 部分 SQL 设置 * @@ -138,7 +130,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper selectIgnore(SFunction... columns) { if (ArrayUtils.isNotEmpty(columns)) { for (SFunction s : columns) { - ignoreColumns.add(this.alias + StringPool.DOT + super.columnToString(s, false)); + ignoreColumns.add(Constant.TABLE_ALIAS + StringPool.DOT + getColumnCache(s).getColumn()); } } return typedThis; @@ -146,7 +138,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper column, boolean onlyColumn) { - return this.alias + StringPool.DOT + super.columnToString(column, onlyColumn); + return Constant.TABLE_ALIAS + StringPool.DOT + super.columnToString(column, onlyColumn); } public MPJLambdaQueryWrapper select(String... columns) { @@ -174,7 +166,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper - this.alias + StringPool.DOT + c.getColumn()).collect(Collectors.toList())); + Constant.TABLE_ALIAS + StringPool.DOT + c.getColumn()).collect(Collectors.toList())); return typedThis; } @@ -185,7 +177,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper selectAll(Class clazz) { - return selectAll(clazz, this.alias); + return selectAll(clazz, Constant.TABLE_ALIAS); } /** @@ -194,14 +186,13 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper selectAll(Class clazz, String as) { TableInfo info = TableInfoHelper.getTableInfo(clazz); Assert.notNull(info, "can not find table info"); if (info.havePK()) { selectColumns.add(as + StringPool.DOT + info.getKeyColumn()); } - selectColumns.addAll(info.getFieldList().stream().filter(TableFieldInfo::isSelect).map(i -> + selectColumns.addAll(info.getFieldList().stream().map(i -> as + StringPool.DOT + i.getColumn()).collect(Collectors.toList())); return typedThis; } @@ -229,12 +220,9 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper extends AbstractLambdaWrapper extends AbstractWrapper extends AbstractWrapper alias(String tableAlias) { - this.alias = tableAlias; - return typedThis; - } - @Override public MPJQueryWrapper select(String... columns) { if (ArrayUtils.isNotEmpty(columns)) { @@ -130,7 +122,7 @@ public class MPJQueryWrapper extends AbstractWrapper - this.alias + StringPool.DOT + c.getColumn()).collect(Collectors.toList())); + Constant.TABLE_ALIAS + StringPool.DOT + c.getColumn()).collect(Collectors.toList())); return typedThis; } @@ -141,7 +133,7 @@ public class MPJQueryWrapper extends AbstractWrapper selectAll(Class clazz) { - selectAll(clazz, this.alias); + selectAll(clazz, Constant.TABLE_ALIAS); return typedThis; } @@ -157,7 +149,7 @@ public class MPJQueryWrapper extends AbstractWrapper + selectColumns.addAll(info.getFieldList().stream().map(i -> as + StringPool.DOT + i.getColumn()).collect(Collectors.toList())); return typedThis; } @@ -178,18 +170,13 @@ public class MPJQueryWrapper extends AbstractWrapper lambda() { return new MPJLambdaQueryWrapper<>(getEntity(), getEntityClass(), from, sqlSelect, paramNameSeq, paramNameValuePairs, expression, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns); diff --git a/src/main/java/com/github/yulichang/toolkit/Constant.java b/src/main/java/com/github/yulichang/toolkit/Constant.java index 4520fb3..31854d7 100644 --- a/src/main/java/com/github/yulichang/toolkit/Constant.java +++ b/src/main/java/com/github/yulichang/toolkit/Constant.java @@ -11,6 +11,8 @@ public interface Constant { */ String TABLE_ALIAS = "t"; + String AS = " AS "; + String ON = " ON "; String JOIN = "JOIN"; @@ -37,4 +39,9 @@ public interface Constant { * " INNER JOIN " */ String INNER_JOIN = StringPool.SPACE + INNER + StringPool.SPACE + JOIN + StringPool.SPACE; + + /** + * " t" + */ + String SPACE_TABLE_ALIAS = StringPool.SPACE + Constant.TABLE_ALIAS; } diff --git a/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java b/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java index d4ab2f3..9b9ece8 100644 --- a/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java +++ b/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java @@ -1,14 +1,15 @@ package com.github.yulichang.wrapper; -import com.baomidou.mybatisplus.core.metadata.MPJTableAliasHelper; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.yulichang.toolkit.Constant; import com.github.yulichang.toolkit.LambdaUtils; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import static java.util.stream.Collectors.joining; @@ -19,6 +20,12 @@ import static java.util.stream.Collectors.joining; */ public abstract class MPJAbstractLambdaWrapper> extends MPJAbstractWrapper { + + /** + * 关联的表 + */ + protected Map, Integer> subTable = new HashMap<>(); + /** * 缓存字段 */ @@ -26,13 +33,7 @@ public abstract class MPJAbstractLambdaWrapper String columnToString(X column) { - return columnToString((SFunction) column, hasAlias || entityClass != - LambdaUtils.getEntityClass((SFunction) column)); - } - - @Override - protected String columnToString(X column, boolean hasAlias) { - return columnToString((SFunction) column, hasAlias); + return columnToString((SFunction) column); } @Override @@ -41,9 +42,9 @@ public abstract class MPJAbstractLambdaWrapper columnToString((SFunction) i)).collect(joining(StringPool.COMMA)); } - protected String columnToString(SFunction column, boolean hasAlias) { - return (hasAlias ? MPJTableAliasHelper.get(LambdaUtils.getEntityClass(column)).getAliasDOT() : - StringPool.EMPTY) + getCache(column).getColumn(); + protected String columnToString(SFunction column) { + return Constant.TABLE_ALIAS + getDefault(subTable.get(LambdaUtils.getEntityClass(column))) + StringPool.DOT + + getCache(column).getColumn(); } protected ColumnCache getCache(SFunction fn) { @@ -55,4 +56,12 @@ public abstract class MPJAbstractLambdaWrapper> extends Wrapper implements Compare, Nested, Join, Func, OnCompare { - - /** - * 是否使用别名 - */ - protected boolean hasAlias; - /** * 占位符 */ @@ -59,7 +51,7 @@ public abstract class MPJAbstractWrapper entityClass; + private Class entityClass; @Override public T getEntity() { return entity; } + public Children setEntity(T entity) { + this.entity = entity; + return typedThis; + } + + public Class getEntityClass() { + if (entityClass == null && entity != null) { + entityClass = (Class) entity.getClass(); + } + return entityClass; + } + + public Children setEntityClass(Class entityClass) { + if (entityClass != null) { + this.entityClass = entityClass; + } + return typedThis; + } + @Override public Children allEq(boolean condition, Map, V> params, boolean null2IsNull) { if (condition && CollectionUtils.isNotEmpty(params)) { @@ -318,6 +329,7 @@ public abstract class MPJAbstractWrapper SFunction columnSqlInjectFilter(SFunction column) { return column; @@ -372,11 +384,9 @@ public abstract class MPJAbstractWrapper formatParam(null, val))); } - protected Children addCondition(boolean condition, SFunction column, SqlKeyword sqlKeyword, - SFunction val) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column, hasAlias || entityClass != - LambdaUtils.getEntityClass(column)), sqlKeyword, columnToSqlSegment(val, hasAlias || - entityClass != LambdaUtils.getEntityClass(val)))); + protected Children addCondition(boolean condition, SFunction column, SqlKeyword sqlKeyword, SFunction val) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), sqlKeyword, + columnToSqlSegment(val))); } /** @@ -407,7 +417,6 @@ public abstract class MPJAbstractWrapper columnToString(column); } - protected final ISqlSegment columnToSqlSegment(SFunction column, boolean hasAlias) { - return () -> columnToString(column, hasAlias); - } - /** * 获取 columnName */ @@ -574,10 +579,6 @@ public abstract class MPJAbstractWrapper String columnToString(X column, boolean hasAlias) { - return (String) column; - } - /** * 多字段转换为逗号 "," 分割字符串 * @@ -633,4 +634,36 @@ public abstract class MPJAbstractWrapper Children le(boolean condition, SFunction column, SFunction val) { return addCondition(condition, column, LE, val); } + + @Override + public Children between(boolean condition, SFunction column, SFunction val1, SFunction val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), BETWEEN, + columnToSqlSegment(val1), AND, columnToSqlSegment(val2))); + } + + public Children between(boolean condition, SFunction column, Object val1, SFunction val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), BETWEEN, + () -> formatParam(null, val1), AND, columnToSqlSegment(val2))); + } + + public Children between(boolean condition, SFunction column, SFunction val1, Object val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), BETWEEN, + columnToSqlSegment(val1), AND, () -> formatParam(null, val2))); + } + + @Override + public Children notBetween(boolean condition, SFunction column, SFunction val1, SFunction val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), NOT_BETWEEN, + columnToSqlSegment(val1), AND, columnToSqlSegment(val2))); + } + + public Children notBetween(boolean condition, SFunction column, Object val1, SFunction val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), NOT_BETWEEN, + () -> formatParam(null, val1), AND, columnToSqlSegment(val2))); + } + + public Children notBetween(boolean condition, SFunction column, SFunction val1, Object val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), NOT_BETWEEN, + columnToSqlSegment(val1), AND, () -> formatParam(null, val2))); + } } diff --git a/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index 571ac51..d63c9dc 100644 --- a/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -2,7 +2,9 @@ package com.github.yulichang.wrapper; import com.baomidou.mybatisplus.core.conditions.SharedString; import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; -import com.baomidou.mybatisplus.core.metadata.*; +import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.toolkit.Constant; @@ -11,10 +13,13 @@ import com.github.yulichang.wrapper.enums.BaseFuncEnum; import com.github.yulichang.wrapper.interfaces.LambdaJoin; import com.github.yulichang.wrapper.interfaces.Query; import com.github.yulichang.wrapper.interfaces.on.OnFunction; +import lombok.Data; +import lombok.Getter; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -28,40 +33,61 @@ import java.util.stream.Collectors; * @author yulichang * @see com.github.yulichang.toolkit.Wrappers */ -@SuppressWarnings("unused") +@SuppressWarnings("all") public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper> implements Query>, LambdaJoin> { /** * 查询字段 sql */ - private final SharedString sqlSelect = new SharedString(); + private SharedString sqlSelect = new SharedString(); /** * 查询表 */ private final SharedString from = new SharedString(); + /** + * 主表别名 + */ + private final SharedString alias = new SharedString(Constant.TABLE_ALIAS); + /** * 查询的字段 */ - private final List selectColumns = new ArrayList<>(); + private final List selectColumns = new ArrayList<>(); /** * 忽略查询的字段 */ - private final List ignoreColumns = new ArrayList<>(); + private final List ignoreColumns = new ArrayList<>(); + + /** + * 表序号 + */ + private int tableIndex = 1; /** * ON sql wrapper集合 */ - private final List joinSql = new ArrayList<>(); + private final List> onWrappers = new ArrayList<>(); + + /** + * 连表关键字 on 条件 func 使用 + */ + @Getter + private String keyWord; + + /** + * 连表实体类 on 条件 func 使用 + */ + @Getter + private Class joinClass; /** * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery() */ public MPJLambdaWrapper() { - this.hasAlias = true; super.initNeed(); } @@ -69,27 +95,22 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper entityClass, AtomicInteger paramNameSeq, + MPJLambdaWrapper(T entity, Class entityClass, SharedString sqlSelect, AtomicInteger paramNameSeq, Map paramNameValuePairs, MergeSegments mergeSegments, - SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, boolean hasAlias) { - this.entityClass = entityClass; + SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, + Map, Integer> subTable, String keyWord, Class joinClass) { + super.setEntity(entity); + super.setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; this.paramNameValuePairs = paramNameValuePairs; this.expression = mergeSegments; + this.sqlSelect = sqlSelect; this.lastSql = lastSql; this.sqlComment = sqlComment; this.sqlFirst = sqlFirst; - this.hasAlias = hasAlias; - } - - @Override - protected MPJLambdaWrapper instance() { - return instance(true, null); - } - - protected MPJLambdaWrapper instance(boolean hasAlias, Class entityClass) { - return new MPJLambdaWrapper<>(entityClass, paramNameSeq, paramNameValuePairs, new MergeSegments(), - SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), hasAlias); + this.subTable = subTable; + this.keyWord = keyWord; + this.joinClass = joinClass; } @Override @@ -97,7 +118,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper select(SFunction... columns) { if (ArrayUtils.isNotEmpty(columns)) { for (SFunction s : columns) { - selectColumns.add(getThisAlias(s) + getCache(s).getColumn()); + selectColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(s), getCache(s).getColumn())); } } return typedThis; @@ -107,23 +128,20 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper select(Class entityClass, Predicate predicate) { TableInfo info = TableInfoHelper.getTableInfo(entityClass); Assert.notNull(info, "table can not be find"); - MPJTableAliasHelper.TableAlias alias = MPJTableAliasHelper.get(entityClass); - info.getFieldList().stream().filter(predicate).collect(Collectors.toList()).forEach(i -> - selectColumns.add((hasAlias ? alias.getAliasDOT() : StringPool.EMPTY) + i.getColumn())); + info.getFieldList().stream().filter(predicate).collect(Collectors.toList()).forEach( + i -> selectColumns.add(SelectColumn.of(entityClass, i.getColumn()))); return typedThis; } @Override public MPJLambdaWrapper selectAs(SFunction column, String alias) { - selectColumns.add(getThisAlias(column) + getCache(column).getColumn() + Constants.AS + alias); + selectColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(column), getCache(column).getColumn(), alias)); return typedThis; } - public MPJLambdaWrapper selectFunc(boolean condition, BaseFuncEnum funcEnum, SFunction column, - String alias) { + public MPJLambdaWrapper selectFunc(boolean condition, BaseFuncEnum funcEnum, SFunction column, String alias) { if (condition) { - selectColumns.add(String.format(funcEnum.getSql(), getThisAlias(column) + getCache(column).getColumn()) - + Constants.AS + alias); + selectColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(column), getCache(column).getColumn(), alias, funcEnum)); } return typedThis; } @@ -131,7 +149,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper selectFunc(boolean condition, BaseFuncEnum funcEnum, Object column, String alias) { if (condition) { - selectColumns.add(String.format(funcEnum.getSql(), column.toString()) + Constants.AS + alias); + selectColumns.add(SelectColumn.of(null, column.toString(), alias, funcEnum)); } return typedThis; } @@ -139,12 +157,11 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper selectAll(Class clazz) { TableInfo info = TableInfoHelper.getTableInfo(clazz); Assert.notNull(info, "table can not be find -> %s", clazz); - String dot = hasAlias ? MPJTableAliasHelper.get(clazz).getAliasDOT() : StringPool.EMPTY; if (info.havePK()) { - selectColumns.add(dot + info.getKeyColumn()); + selectColumns.add(SelectColumn.of(clazz, info.getKeyColumn())); } - info.getFieldList().stream().filter(TableFieldInfo::isSelect).forEach(c -> - selectColumns.add(dot + c.getColumn())); + info.getFieldList().forEach(c -> + selectColumns.add(SelectColumn.of(clazz, c.getColumn()))); return typedThis; } @@ -153,21 +170,12 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper selectIgnore(SFunction... columns) { if (ArrayUtils.isNotEmpty(columns)) { for (SFunction s : columns) { - ignoreColumns.add(getThisAlias(s) + getCache(s).getColumn()); + ignoreColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(s), getCache(s).getColumn())); } } return typedThis; } - - @Override - public MPJLambdaWrapper selectQuery(Class clazz, OnFunction function, String alias) { - MPJLambdaWrapper apply = function.apply(instance(false, clazz)); - selectColumns.add(String.format("(SELECT %s FROM %s %s)", apply.getSqlSelect(), - TableInfoHelper.getTableInfo(clazz).getTableName(), apply.getCustomSqlSegment()) + Constants.AS + alias); - return this; - } - /** * 查询条件 SQL 片段 */ @@ -175,9 +183,15 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper c.getFuncEnum() == null && ignoreColumns.stream().anyMatch(i -> + i.getClazz() == c.getClazz() && Objects.equals(c.getColumnName(), i.getColumnName()))); } - sqlSelect.setStringValue(String.join(StringPool.COMMA, selectColumns)); + String s = selectColumns.stream().map(i -> { + String str = Constant.TABLE_ALIAS + getDefault(subTable.get(i.getClazz())) + StringPool.DOT + i.getColumnName(); + return (i.getFuncEnum() == null ? str : String.format(i.getFuncEnum().getSql(), str)) + + (StringUtils.isBlank(i.getAlias()) ? StringPool.EMPTY : (Constant.AS + i.getAlias())); + }).collect(Collectors.joining(StringPool.COMMA)); + sqlSelect.setStringValue(s); } return sqlSelect.getStringValue(); } @@ -187,15 +201,39 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper wrapper : onWrappers) { + String tableName = TableInfoHelper.getTableInfo(wrapper.getJoinClass()).getTableName(); + value.append(wrapper.getKeyWord()) + .append(tableName) + .append(Constant.SPACE_TABLE_ALIAS) + .append(subTable.get(wrapper.getJoinClass())) + .append(Constant.ON) + .append(wrapper.getExpression().getNormal().getSqlSegment()); + } + from.setStringValue(value.toString()); } return from.getStringValue(); } - public boolean getAutoAlias() { - return true; + public String getAlias() { + return alias.getStringValue(); } + /** + * 用于生成嵌套 sql + *

故 sqlSelect 不向下传递

+ */ + @Override + protected MPJLambdaWrapper instance() { + return instance(null, null); + } + + protected MPJLambdaWrapper instance(String keyWord, Class joinClass) { + return new MPJLambdaWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs, + new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), + this.subTable, keyWord, joinClass); + } @Override public void clear() { @@ -204,21 +242,68 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper join(String keyWord, boolean condition, Class clazz, OnFunction function) { if (condition) { - joinSql.add(keyWord + TableInfoHelper.getTableInfo(clazz).getTableName() + - Constants.SPACE + MPJTableAliasHelper.get(clazz).getAlias() + - Constant.ON + function.apply(instance()).getExpression().getNormal().getSqlSegment()); + MPJLambdaWrapper apply = function.apply(instance(keyWord, clazz)); + onWrappers.add(apply); + subTable.put(clazz, tableIndex); + tableIndex++; } return typedThis; } - private String getThisAlias(SFunction function) { - return hasAlias ? MPJTableAliasHelper.get(LambdaUtils.getEntityClass(function)).getAliasDOT() : - StringPool.EMPTY; + /** + * select字段 + */ + @Data + public static class SelectColumn { + + /** + * 字段实体类 + */ + private Class clazz; + + /** + * 数据库字段名 + */ + private String columnName; + + /** + * 字段别名 + */ + private String alias; + + /** + * 字段函数 + */ + private BaseFuncEnum funcEnum; + + /** + * 自定义函数填充参数 + */ + private List> funcArgs; + + private SelectColumn(Class clazz, String columnName, String alias, BaseFuncEnum funcEnum) { + this.clazz = clazz; + this.columnName = columnName; + this.alias = alias; + this.funcEnum = funcEnum; + } + + public static SelectColumn of(Class clazz, String columnName) { + return new SelectColumn(clazz, columnName, null, null); + } + + public static SelectColumn of(Class clazz, String columnName, String alias) { + return new SelectColumn(clazz, columnName, alias, null); + } + + public static SelectColumn of(Class clazz, String columnName, String alias, BaseFuncEnum funcEnum) { + return new SelectColumn(clazz, columnName, alias, funcEnum); + } } } diff --git a/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java b/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java index 66adf65..6557c10 100644 --- a/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java +++ b/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java @@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.toolkit.LambdaUtils; import com.github.yulichang.wrapper.enums.BaseFuncEnum; import com.github.yulichang.wrapper.enums.DefaultFuncEnum; -import com.github.yulichang.wrapper.interfaces.on.OnFunction; import java.io.Serializable; import java.util.function.Predicate; @@ -52,22 +51,6 @@ public interface Query extends Serializable { */ Children selectAs(SFunction column, String alias); - /** - * 子查询 - * - * @param clazz 查询的类 - * @param function 查询lambda - * @param alias 别名 - */ - Children selectQuery(Class clazz, OnFunction function, String alias); - - /** - * ignore - */ - default Children selectQuery(Class clazz, OnFunction function, SFunction alias) { - return selectQuery(clazz, function, LambdaUtils.getName(alias)); - } - /** * 聚合函数查询 * diff --git a/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnCompare.java b/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnCompare.java index 0113cb7..00d6166 100644 --- a/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnCompare.java +++ b/src/main/java/com/github/yulichang/wrapper/interfaces/on/OnCompare.java @@ -115,4 +115,40 @@ public interface OnCompare extends Serializable { * @return children */ Children le(boolean condition, SFunction column, SFunction val); + + /** + * ignore + */ + default Children between(SFunction column, SFunction val1, SFunction val2) { + return between(true, column, val1, val2); + } + + /** + * BETWEEN 值1 AND 值2 + * + * @param condition 执行条件 + * @param column 字段 + * @param val1 值1 + * @param val2 值2 + * @return children + */ + Children between(boolean condition, SFunction column, SFunction val1, SFunction val2); + + /** + * ignore + */ + default Children notBetween(SFunction column, SFunction val1, SFunction val2) { + return notBetween(true, column, val1, val2); + } + + /** + * NOT BETWEEN 值1 AND 值2 + * + * @param condition 执行条件 + * @param column 字段 + * @param val1 值1 + * @param val2 值2 + * @return children + */ + Children notBetween(boolean condition, SFunction column, SFunction val1, SFunction val2); }