, 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);
}