24282 il y a 1 an
Parent
commit
6825613741

+ 6 - 6
my-test/src/main/java/org/example/join/JoinMapper.java

@@ -18,36 +18,36 @@ public interface JoinMapper {
      * 列表
      */
     @SelectProvider(type = SqlProvider.class, method = "getSql")
-    List<Map<String, Object>> listMap(@Param(ISqlRunner.SQL) Sql<?> sql);
+    List<Map<String, Object>> listMap(@Param(ISqlRunner.SQL) Sql sql);
 
     /**
      * 分页
      */
     @SelectProvider(type = SqlProvider.class, method = "getSql")
-    Page<Map<String, Object>> pageMap(@Param(ISqlRunner.SQL) Sql<?> sql, @Param(ISqlRunner.PAGE) Page<?> page);
+    Page<Map<String, Object>> pageMap(@Param(ISqlRunner.SQL) Sql sql, @Param(ISqlRunner.PAGE) Page<?> page);
 
     /**
      * 单条纪录
      */
     @SelectProvider(type = SqlProvider.class, method = "getSql")
-    Map<String, Object> oneMap(@Param(ISqlRunner.SQL) Sql<?> sql);
+    Map<String, Object> oneMap(@Param(ISqlRunner.SQL) Sql sql);
 
     /**
      * 列表
      */
     @SelectProvider(type = SqlProvider.class, method = "getSql")
-    List<Object> listObj(@Param(ISqlRunner.SQL) Sql<?> sql);
+    List<Object> listObj(@Param(ISqlRunner.SQL) Sql sql);
 
     /**
      * 分页
      */
     @SelectProvider(type = SqlProvider.class, method = "getSql")
-    Page<Object> pageObj(@Param(ISqlRunner.SQL) Sql<?> sql, @Param(ISqlRunner.PAGE) Page<?> page);
+    Page<Object> pageObj(@Param(ISqlRunner.SQL) Sql sql, @Param(ISqlRunner.PAGE) Page<?> page);
 
     /**
      * 单条纪录
      */
     @SelectProvider(type = SqlProvider.class, method = "getSql")
-    Object oneObj(@Param(ISqlRunner.SQL) Sql<?> sql);
+    Object oneObj(@Param(ISqlRunner.SQL) Sql sql);
 
 }

+ 1 - 1
my-test/src/main/java/org/example/join/model/AbstractQueryColumn.java

@@ -15,7 +15,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.StringJoiner;
 
-public abstract class AbstractQueryColumn implements IFormat, IQueryColumn {
+public abstract class AbstractQueryColumn implements IQueryColumn {
 
     /**
      * 计算列表

+ 2 - 2
my-test/src/main/java/org/example/join/model/QueryColumn.java

@@ -1,8 +1,8 @@
 package org.example.join.model;
 
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import lombok.RequiredArgsConstructor;
-import org.example.join.sql.SqlContext;
 
 @RequiredArgsConstructor
 public class QueryColumn extends AbstractQueryColumn {
@@ -24,7 +24,7 @@ public class QueryColumn extends AbstractQueryColumn {
 
     @Override
     public String toSql() {
-        String sql = SqlContext.getTableAlias(table) + StringPool.DOT + name;
+        String sql = StrUtil.isNotBlank(table.getAlias()) ? table.getAlias() : table.getName() + StringPool.DOT + name;
         return spliceCompute(sql);
     }
 

+ 6 - 2
my-test/src/main/java/org/example/join/model/Table.java

@@ -1,9 +1,9 @@
 package org.example.join.model;
 
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import org.example.join.sql.SqlContext;
 
 @Getter
 @RequiredArgsConstructor
@@ -19,7 +19,11 @@ public class Table implements ITable {
 
     @Override
     public String toSql() {
-        return name + StringPool.SPACE + SqlContext.getTableAlias(this);
+        if (StrUtil.isBlank(alias)) {
+            return name;
+        }
+
+        return name + StringPool.SPACE + alias;
     }
 
 }

+ 11 - 3
my-test/src/main/java/org/example/join/model/TableJoin.java

@@ -1,5 +1,8 @@
 package org.example.join.model;
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.example.join.sql.SqlConstant;
@@ -13,13 +16,18 @@ import java.util.stream.Collectors;
 public class TableJoin implements ITable {
 
     private final String joinType;
-    private final Table table;
+    private final ITable table;
     private final List<QueryCondition> queryConditionList = new ArrayList<>();
 
     @Override
     public String toSql() {
-        return joinType + table.toSql() + SqlConstant.ON +
-                queryConditionList.stream().map(QueryCondition::toSql).collect(Collectors.joining(SqlConstant.AND));
+        String on = queryConditionList.stream()
+                .filter(ObjectUtil::isNotNull)
+                .map(QueryCondition::toSql)
+                .filter(StrUtil::isNotBlank)
+                .collect(Collectors.joining(SqlConstant.AND));
+
+        return joinType + table.toSql() + (StrUtil.isNotBlank(on) ? SqlConstant.ON + on : StringPool.EMPTY);
     }
 
 }

+ 20 - 0
my-test/src/main/java/org/example/join/model/TableSublist.java

@@ -0,0 +1,20 @@
+package org.example.join.model;
+
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.example.join.sql.Sql;
+
+@Getter
+@RequiredArgsConstructor
+public class TableSublist implements ITable {
+
+    private final Sql sql;
+    private final String alias;
+
+    @Override
+    public String toSql() {
+        return StringPool.LEFT_BRACKET + sql.toSql() + StringPool.RIGHT_BRACKET + StringPool.SPACE + alias;
+    }
+
+}

+ 8 - 8
my-test/src/main/java/org/example/join/sql/From.java

@@ -3,31 +3,31 @@ package org.example.join.sql;
 import org.example.join.model.Table;
 import org.example.join.model.TableJoin;
 
-public class From<R> extends SqlWrapper<R> {
+public class From extends SqlWrapper {
 
-    private final Sql<R> sql;
+    private final Sql sql;
 
-    protected From(Sql<R> sql) {
+    protected From(Sql sql) {
         super(sql);
         this.sql = sql;
     }
 
-    public Join<R> innerJoin(Table table) {
+    public Join innerJoin(Table table) {
         return join(SqlConstant.INNER_JOIN, table);
     }
 
-    public Join<R> leftJoin(Table table) {
+    public Join leftJoin(Table table) {
         return join(SqlConstant.LEFT_JOIN, table);
     }
 
-    public Join<R> rightJoin(Table table) {
+    public Join rightJoin(Table table) {
         return join(SqlConstant.RIGHT_JOIN, table);
     }
 
-    private Join<R> join(String joinType, Table table) {
+    private Join join(String joinType, Table table) {
         TableJoin tableJoin = new TableJoin(joinType, table);
         sql.queryTableList.add(tableJoin);
-        return new Join<>(this, tableJoin.getQueryConditionList());
+        return new Join(this, tableJoin.getQueryConditionList());
     }
 
 }

+ 6 - 20
my-test/src/main/java/org/example/join/sql/Join.java

@@ -1,35 +1,21 @@
 package org.example.join.sql;
 
-import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.collection.ListUtil;
 import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
 import org.example.join.model.QueryCondition;
 
-import java.util.Arrays;
 import java.util.List;
-import java.util.Objects;
 
 @RequiredArgsConstructor(access = AccessLevel.PROTECTED)
-public class Join<R> {
+public class Join {
 
-    private final From<R> from;
+    private final From from;
     private final List<QueryCondition> queryConditionList;
 
-    public From<R> on(QueryCondition... queryConditions) {
-
-        if (ObjectUtil.isEmpty(queryConditions)) {
-            throw new IllegalArgumentException("on不能为空");
-        }
-
-        List<QueryCondition> list = Arrays.stream(queryConditions).filter(Objects::nonNull).toList();
-
-        if (list.isEmpty()) {
-            throw new IllegalArgumentException("on不能为空");
-        }
-
-        queryConditionList.addAll(list);
-
+    public From on(QueryCondition... queryConditions) {
+        queryConditionList.addAll(ListUtil.toList(queryConditions));
         return from;
     }
 
-}
+}

+ 9 - 9
my-test/src/main/java/org/example/join/sql/Select.java

@@ -4,17 +4,17 @@ import cn.hutool.core.collection.ListUtil;
 import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
 import org.example.join.model.IQueryColumn;
-import org.example.join.model.Table;
+import org.example.join.model.ITable;
 
 @RequiredArgsConstructor(access = AccessLevel.PROTECTED)
-public class Select<R> {
+public class Select {
 
-    private final Sql<R> sql;
+    private final Sql sql;
 
     /**
      * 忽略查询逻辑删除
      */
-    public Select<R> logicIgnore() {
+    public Select logicIgnore() {
         sql.logic = null;
         return this;
     }
@@ -22,7 +22,7 @@ public class Select<R> {
     /**
      * 查询已逻辑删除数据
      */
-    public Select<R> logic() {
+    public Select logic() {
         sql.logic = true;
         return this;
     }
@@ -30,19 +30,19 @@ public class Select<R> {
     /**
      * 去重
      */
-    public Select<R> distinct() {
+    public Select distinct() {
         sql.distinct = true;
         return this;
     }
 
-    public Select<R> select(IQueryColumn... columns) {
+    public Select select(IQueryColumn... columns) {
         sql.queryFieldsList.addAll(ListUtil.toList(columns));
         return this;
     }
 
-    public From<R> from(Table... tables) {
+    public From from(ITable... tables) {
         sql.queryTableList.addAll(ListUtil.toList(tables));
-        return new From<>(sql);
+        return new From(sql);
     }
 
 }

+ 146 - 5
my-test/src/main/java/org/example/join/sql/Sql.java

@@ -1,35 +1,176 @@
 package org.example.join.sql;
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
+import org.example.join.model.IFormat;
 import org.example.join.model.IQueryColumn;
 import org.example.join.model.ITable;
 import org.example.join.model.QueryColumn;
 import org.example.join.model.QueryCondition;
 import org.example.join.model.QueryConditionOrder;
+import org.example.join.model.Table;
+import org.example.join.model.TableJoin;
+import org.example.join.model.TableSublist;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 @RequiredArgsConstructor(access = AccessLevel.PROTECTED)
-public class Sql<R> {
+public class Sql implements IFormat {
 
-    protected final Class<R> resultCls;
     protected final List<IQueryColumn> queryFieldsList = new ArrayList<>();
     protected final List<ITable> queryTableList = new ArrayList<>();
     protected final List<QueryCondition> queryConditionList = new ArrayList<>();
     protected final List<QueryColumn> groupByList = new ArrayList<>();
     protected final List<QueryConditionOrder> orderByList = new ArrayList<>();
-    protected final List<Sql<R>> unionList = new ArrayList<>();
+    protected final List<Sql> unionList = new ArrayList<>();
 
     protected Boolean logic = false;
     protected Boolean distinct = false;
     protected String limit = StringPool.EMPTY;
     protected String unionType = StringPool.EMPTY;
 
-    public static <R> Select<R> create(Class<R> cls) {
-        return new Select<>(new Sql<>(cls));
+    public static Select create() {
+        return new Select(new Sql());
+    }
+
+    @Override
+    public String toSql() {
+        // 没有union返回sql
+        if (unionList.isEmpty()) {
+            return toSql(this);
+        }
+
+        // 拼接union sql语句
+        StringBuilder sqlSb = new StringBuilder();
+        unionList.forEach(itemSql -> appendSql(sqlSb, itemSql));
+        appendSql(sqlSb, this);
+        return sqlSb.toString();
+    }
+
+    /**
+     * 拼接sql union
+     */
+    private void appendSql(StringBuilder sqlSb, Sql sql) {
+        sqlSb.append(sql.unionType)
+                .append(StringPool.LEFT_BRACKET)
+                .append(toSql(sql))
+                .append(StringPool.RIGHT_BRACKET);
+    }
+
+    /**
+     * sql对象转化为字符串
+     */
+    private String toSql(Sql sql) {
+        // 拼接逻辑删除
+        spliceLogic(sql);
+        // 创建sql字符串
+        return createSql(sql);
+    }
+
+    /**
+     * 拼接逻辑删除
+     */
+    private void spliceLogic(Sql sql) {
+        if (sql.logic == null) {
+            return;
+        }
+
+        List<ITable> queryTableList = sql.queryTableList;
+        for (int i = queryTableList.size() - 1; i >= 0; i--) {
+            ITable iTable = queryTableList.get(i);
+            if (iTable instanceof Table table) {
+                String tableDelFlag = SqlContext.getTableDelFlag(table);
+                if (ObjectUtil.isNotEmpty(tableDelFlag)) {
+                    QueryColumn queryColumn = new QueryColumn(table, tableDelFlag);
+                    sql.queryConditionList.add(0, new QueryCondition(queryColumn, SqlConstant.EQ, sql.logic ? 1 : 0));
+                }
+            } else if (iTable instanceof TableJoin tableJoin && tableJoin.getTable() instanceof Table table) {
+                String tableDelFlag = SqlContext.getTableDelFlag(table);
+                if (ObjectUtil.isNotEmpty(tableDelFlag)) {
+                    QueryColumn queryColumn = new QueryColumn(table, tableDelFlag);
+                    tableJoin.getQueryConditionList().add(new QueryCondition(queryColumn, SqlConstant.EQ, sql.logic ? 1 : 0));
+                }
+            } else {
+                return;
+            }
+        }
+    }
+
+    /**
+     * 创建sql字符串
+     */
+    private String createSql(Sql sql) {
+
+        List<IQueryColumn> queryFieldsList = sql.queryFieldsList;
+        List<ITable> queryTableList = sql.queryTableList;
+        List<QueryCondition> queryConditionList = sql.queryConditionList;
+        List<QueryColumn> groupByList = sql.groupByList;
+        List<QueryConditionOrder> orderByList = sql.orderByList;
+
+        // select fields from table join table on
+        StringBuilder sqlBuilder = new StringBuilder()
+                .append(SqlConstant.SELECT)
+                .append(listFormatSql(queryFieldsList, StringPool.COMMA))
+                .append(SqlConstant.FROM)
+                .append(getQueryTablesSql(queryTableList));
+
+        // where 条件
+        String where = listFormatSql(queryConditionList, SqlConstant.AND);
+        if (StrUtil.isNotBlank(where)) {
+            sqlBuilder.append(SqlConstant.WHERE).append(where);
+        }
+
+        // groupBy 条件
+        String groupBy = listFormatSql(groupByList, StringPool.COMMA);
+        if (StrUtil.isNotBlank(groupBy)) {
+            sqlBuilder.append(SqlConstant.GROUP_BY).append(groupBy);
+        }
+
+        // orderBy 条件
+        String orderBy = listFormatSql(orderByList, StringPool.COMMA);
+        if (StrUtil.isNotBlank(orderBy)) {
+            sqlBuilder.append(SqlConstant.ORDER_BY).append(orderBy);
+        }
+
+        // limit 条件
+        sqlBuilder.append(sql.limit);
+
+        return sqlBuilder.toString();
+    }
+
+    /**
+     * 获取查询表sql
+     */
+    private String getQueryTablesSql(List<ITable> queryTableList) {
+
+        String from = queryTableList.stream()
+                .filter(item -> item instanceof Table || item instanceof TableSublist)
+                .map(IFormat::toSql)
+                .collect(Collectors.joining(StringPool.COMMA));
+
+        String join = queryTableList.stream()
+                .filter(item -> item instanceof TableJoin)
+                .map(IFormat::toSql)
+                .collect(Collectors.joining(StringPool.EMPTY));
+
+        return from + join;
+    }
+
+    /**
+     * 拼接sql片段
+     */
+    private String listFormatSql(List<? extends IFormat> list, String joinStr) {
+        return list.stream()
+                .filter(Objects::nonNull)
+                .map(IFormat::toSql)
+                .filter(StrUtil::isNotEmpty)
+                .collect(Collectors.joining(joinStr));
     }
 
 }

+ 2 - 56
my-test/src/main/java/org/example/join/sql/SqlContext.java

@@ -1,31 +1,25 @@
 package org.example.join.sql;
 
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
 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.StringPool;
 import org.example.join.model.IFormat;
-import org.example.join.model.ITable;
 import org.example.join.model.Table;
-import org.example.join.model.TableJoin;
 
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.StringJoiner;
 
 @SuppressWarnings("unchecked")
 public class SqlContext {
 
-    private static final ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();
+    private static final ThreadLocal<Map<String, Object>> threadLocal = ThreadLocal.withInitial(HashMap::new);
     private static final String PARAM_NUMBER = "paramNumber";
     private static final String PARAM_MAP = "paramMap";
-    private static final String TABLE_ALIAS_MAP = "tableAliasMap";
 
     public static void init(Map<String, Object> paramMap) {
-        Map<String, Object> map = new HashMap<>();
+        Map<String, Object> map = threadLocal.get();
         map.put(PARAM_NUMBER, 1);
         map.put(PARAM_MAP, paramMap);
         threadLocal.set(map);
@@ -55,54 +49,6 @@ public class SqlContext {
         return logicDeleteFieldInfo.getColumn();
     }
 
-    public static String getTableAlias(Table table) {
-        String tableAlias = table.getAlias();
-        if (StrUtil.isBlank(tableAlias)) {
-            tableAlias = getTableAliasMap().get(table.getName());
-            if (StrUtil.isBlank(tableAlias)) {
-                throw new IllegalArgumentException("未知连表:" + table.getName());
-            }
-        }
-        return tableAlias;
-    }
-
-    public static void setTableAliasMap(Sql<?> sql) {
-        Map<String, Object> map = threadLocal.get();
-        map.put(TABLE_ALIAS_MAP, createTableAliasMap(sql));
-    }
-
-    private static Map<String, String> createTableAliasMap(Sql<?> sql) {
-        List<ITable> queryTableList = sql.queryTableList;
-        int number = 1;
-        Map<String, String> tableAliasMap = new HashMap<>();
-
-        for (ITable iTable : queryTableList) {
-            Table table;
-
-            if (iTable instanceof Table item) {
-                table = item;
-            } else if (iTable instanceof TableJoin item) {
-                table = item.getTable();
-            } else {
-                throw new IllegalArgumentException("未知ITable类型");
-            }
-
-            if (ObjectUtil.isEmpty(table.getAlias())) {
-                if (tableAliasMap.containsKey(table.getName())) {
-                    throw new IllegalArgumentException(table.getName() + "表已存在,再次连表请取别名");
-                }
-                tableAliasMap.put(table.getName(), "t" + (number++));
-            }
-        }
-
-        return tableAliasMap;
-    }
-
-    private static Map<String, String> getTableAliasMap() {
-        Map<String, Object> map = threadLocal.get();
-        return (Map<String, String>) map.get(TABLE_ALIAS_MAP);
-    }
-
     private static String getParamKey() {
         Map<String, Object> map = threadLocal.get();
         int paramNumber = (int) map.get(PARAM_NUMBER);

+ 2 - 158
my-test/src/main/java/org/example/join/sql/SqlProvider.java

@@ -1,175 +1,19 @@
 package org.example.join.sql;
 
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.assist.ISqlRunner;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import org.example.join.model.IFormat;
-import org.example.join.model.IQueryColumn;
-import org.example.join.model.ITable;
-import org.example.join.model.QueryColumn;
-import org.example.join.model.QueryCondition;
-import org.example.join.model.QueryConditionOrder;
-import org.example.join.model.Table;
-import org.example.join.model.TableJoin;
 
-import java.util.List;
 import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
 
 public class SqlProvider {
 
     public static String getSql(Map<String, Object> paramMap) {
-        Sql<?> sql = (Sql<?>) paramMap.get(ISqlRunner.SQL);
+        Sql sql = (Sql) paramMap.get(ISqlRunner.SQL);
         try {
-
-            // 初始化sql上下文数据
             SqlContext.init(paramMap);
-
-            // 没有union返回sql
-            if (sql.unionList.isEmpty()) {
-                return toSqlStr(sql);
-            }
-
-            // 拼接union sql语句
-            StringBuilder sqlSb = new StringBuilder();
-            sql.unionList.forEach(itemSql -> appendSql(sqlSb, itemSql));
-            appendSql(sqlSb, sql);
-            return sqlSb.toString();
-
+            return sql.toSql();
         } finally {
-
-            // 清空sql上下文数据
             SqlContext.remove();
-
         }
     }
 
-    /**
-     * 拼接sql union
-     */
-    private static void appendSql(StringBuilder sqlSb, Sql<?> sql) {
-        sqlSb.append(sql.unionType)
-                .append(StringPool.LEFT_BRACKET)
-                .append(toSqlStr(sql))
-                .append(StringPool.RIGHT_BRACKET);
-    }
-
-    /**
-     * sql对象转化为字符串
-     */
-    private static String toSqlStr(Sql<?> sql) {
-
-        // 设置表别名
-        SqlContext.setTableAliasMap(sql);
-
-        // 拼接逻辑删除
-        spliceLogic(sql);
-
-        // 创建sql字符串
-        return createSql(sql);
-    }
-
-    /**
-     * 拼接逻辑删除
-     */
-    private static void spliceLogic(Sql<?> sql) {
-        if (sql.logic == null) {
-            return;
-        }
-
-        List<ITable> queryTableList = sql.queryTableList;
-        for (int i = queryTableList.size() - 1; i >= 0; i--) {
-            ITable iTable = queryTableList.get(i);
-            if (iTable instanceof Table table) {
-                String tableDelFlag = SqlContext.getTableDelFlag(table);
-                if (ObjectUtil.isNotEmpty(tableDelFlag)) {
-                    QueryColumn queryColumn = new QueryColumn(table, tableDelFlag);
-                    sql.queryConditionList.add(0, new QueryCondition(queryColumn, SqlConstant.EQ, sql.logic ? 1 : 0));
-                }
-            } else if (iTable instanceof TableJoin tableJoin) {
-                Table table = tableJoin.getTable();
-                String tableDelFlag = SqlContext.getTableDelFlag(table);
-                if (ObjectUtil.isNotEmpty(tableDelFlag)) {
-                    QueryColumn queryColumn = new QueryColumn(table, tableDelFlag);
-                    tableJoin.getQueryConditionList().add(new QueryCondition(queryColumn, SqlConstant.EQ, sql.logic ? 1 : 0));
-                }
-            } else {
-                throw new IllegalArgumentException("未知ITable类型");
-            }
-        }
-    }
-
-    /**
-     * 创建sql字符串
-     */
-    private static String createSql(Sql<?> sql) {
-
-        List<IQueryColumn> queryFieldsList = sql.queryFieldsList;
-        List<ITable> queryTableList = sql.queryTableList;
-        List<QueryCondition> queryConditionList = sql.queryConditionList;
-        List<QueryColumn> groupByList = sql.groupByList;
-        List<QueryConditionOrder> orderByList = sql.orderByList;
-
-        // select fields from table join table on
-        StringBuilder sqlBuilder = new StringBuilder()
-                .append(SqlConstant.SELECT)
-                .append(listFormatSql(queryFieldsList, StringPool.COMMA))
-                .append(SqlConstant.FROM)
-                .append(getQueryTablesSql(queryTableList));
-
-        // where 条件
-        String where = listFormatSql(queryConditionList, SqlConstant.AND);
-        if (StrUtil.isNotBlank(where)) {
-            sqlBuilder.append(SqlConstant.WHERE).append(where);
-        }
-
-        // groupBy 条件
-        String groupBy = listFormatSql(groupByList, StringPool.COMMA);
-        if (StrUtil.isNotBlank(groupBy)) {
-            sqlBuilder.append(SqlConstant.GROUP_BY).append(groupBy);
-        }
-
-        // orderBy 条件
-        String orderBy = listFormatSql(orderByList, StringPool.COMMA);
-        if (StrUtil.isNotBlank(orderBy)) {
-            sqlBuilder.append(SqlConstant.ORDER_BY).append(orderBy);
-        }
-
-        // limit 条件
-        sqlBuilder.append(sql.limit);
-
-        return sqlBuilder.toString();
-    }
-
-    /**
-     * 获取查询表sql
-     */
-    private static String getQueryTablesSql(List<ITable> queryTableList) {
-
-        String from = queryTableList.stream()
-                .filter(item -> item instanceof Table)
-                .map(IFormat::toSql)
-                .collect(Collectors.joining(StringPool.COMMA));
-
-        String join = queryTableList.stream()
-                .filter(item -> item instanceof TableJoin)
-                .map(IFormat::toSql)
-                .collect(Collectors.joining(StringPool.EMPTY));
-
-        return from + join;
-    }
-
-    /**
-     * 拼接sql片段
-     */
-    private static String listFormatSql(List<? extends IFormat> list, String joinStr) {
-        return list.stream()
-                .filter(Objects::nonNull)
-                .map(IFormat::toSql)
-                .filter(StrUtil::isNotEmpty)
-                .collect(Collectors.joining(joinStr));
-    }
-
 }

+ 47 - 31
my-test/src/main/java/org/example/join/sql/SqlWrapper.java

@@ -10,9 +10,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
 import org.example.join.JoinMapper;
+import org.example.join.model.AbstractQueryColumn;
 import org.example.join.model.QueryColumn;
 import org.example.join.model.QueryCondition;
 import org.example.join.model.QueryConditionOrder;
+import org.example.join.model.TableSublist;
 
 import java.util.Arrays;
 import java.util.Date;
@@ -20,96 +22,100 @@ import java.util.List;
 import java.util.Objects;
 
 @RequiredArgsConstructor(access = AccessLevel.PROTECTED)
-public class SqlWrapper<R> {
+public class SqlWrapper extends AbstractQueryColumn {
 
     private static final JoinMapper mapper = SpringUtil.getBean(JoinMapper.class);
 
-    private final Sql<R> sql;
+    private final Sql sql;
 
-    public SqlWrapper<R> where(QueryCondition... queryCondition) {
+    public TableSublist asTable(String alias) {
+        return new TableSublist(sql, alias);
+    }
+
+    public SqlWrapper where(QueryCondition... queryCondition) {
         if (ObjectUtil.isNotEmpty(queryCondition)) {
             sql.queryConditionList.addAll(ListUtil.toList(queryCondition));
         }
         return this;
     }
 
-    public SqlWrapper<R> where(boolean condition, QueryCondition... queryCondition) {
+    public SqlWrapper where(boolean condition, QueryCondition... queryCondition) {
         if (condition) {
             where(queryCondition);
         }
         return this;
     }
 
-    public SqlWrapper<R> groupBy(QueryColumn... queryColumns) {
+    public SqlWrapper groupBy(QueryColumn... queryColumns) {
         if (ObjectUtil.isNotEmpty(queryColumns)) {
             sql.groupByList.addAll(ListUtil.toList(queryColumns));
         }
         return this;
     }
 
-    public SqlWrapper<R> orderBy(QueryConditionOrder... queryConditionOrders) {
+    public SqlWrapper orderBy(QueryConditionOrder... queryConditionOrders) {
         if (ObjectUtil.isNotEmpty(queryConditionOrders)) {
             sql.orderByList.addAll(ListUtil.toList(queryConditionOrders));
         }
         return this;
     }
 
-    public SqlWrapper<R> orderByAsc(QueryColumn... queryColumns) {
+    public SqlWrapper orderByAsc(QueryColumn... queryColumns) {
         if (ObjectUtil.isNotEmpty(queryColumns)) {
             sql.orderByList.addAll(Arrays.stream(queryColumns).filter(Objects::nonNull).map(QueryColumn::asc).toList());
         }
         return this;
     }
 
-    public SqlWrapper<R> orderByDesc(QueryColumn... queryColumns) {
+    public SqlWrapper orderByDesc(QueryColumn... queryColumns) {
         if (ObjectUtil.isNotEmpty(queryColumns)) {
             sql.orderByList.addAll(Arrays.stream(queryColumns).filter(Objects::nonNull).map(QueryColumn::desc).toList());
         }
         return this;
     }
 
-    public SqlWrapper<R> limit(Number offset) {
+    public SqlWrapper limit(Number offset) {
         sql.limit = SqlConstant.LIMIT + offset.longValue();
         return this;
     }
 
-    public SqlWrapper<R> limit(Number offset, Number rows) {
+    public SqlWrapper limit(Number offset, Number rows) {
         sql.limit = SqlConstant.LIMIT + offset.longValue() + StringPool.COMMA + rows.longValue();
         return this;
     }
 
-    public Select<R> union() {
-        Sql<R> unionSql = new Sql<>(sql.resultCls);
+    public Select union() {
+        Sql unionSql = new Sql();
         unionSql.unionType = SqlConstant.UNION;
         unionSql.unionList.add(sql);
-        return new Select<>(unionSql);
+        return new Select(unionSql);
     }
 
-    public Select<R> unionAll() {
-        Sql<R> unionSql = new Sql<>(sql.resultCls);
+    public Select unionAll() {
+        Sql unionSql = new Sql();
         unionSql.unionType = SqlConstant.UNION_ALL;
         unionSql.unionList.add(sql);
-        return new Select<>(unionSql);
+        return new Select(unionSql);
     }
 
-    public List<R> list() {
+    public <R> List<R> list(Class<R> cls) {
         List<?> result;
-        if (CharSequence.class.isAssignableFrom(sql.resultCls)
-                || Number.class.isAssignableFrom(sql.resultCls)
-                || Date.class.isAssignableFrom(sql.resultCls)) {
+        if (CharSequence.class.isAssignableFrom(cls)
+                || Number.class.isAssignableFrom(cls)
+                || Date.class.isAssignableFrom(cls)) {
             result = mapper.listObj(sql);
         } else {
             result = mapper.listMap(sql);
         }
 
-        return BeanUtil.copyToList(result, sql.resultCls);
+        return BeanUtil.copyToList(result, cls);
     }
 
-    public Page<R> page(Page<?> page) {
+    public <R> Page<R> page(Class<R> cls, Page<?> page) {
         Page<?> result;
-        if (CharSequence.class.isAssignableFrom(sql.resultCls)
-                || Number.class.isAssignableFrom(sql.resultCls)
-                || Date.class.isAssignableFrom(sql.resultCls)) {
+        if (CharSequence.class.isAssignableFrom(cls)
+                || Number.class.isAssignableFrom(cls)
+                || Date.class.isAssignableFrom(cls)) {
             result = mapper.pageObj(sql, page);
         } else {
             result = mapper.pageMap(sql, page);
@@ -120,21 +126,31 @@ public class SqlWrapper<R> {
         rPage.setCurrent(result.getCurrent());
         rPage.setSize(result.getSize());
         rPage.setTotal(result.getTotal());
-        rPage.setRecords(BeanUtil.copyToList(result.getRecords(), sql.resultCls));
+        rPage.setRecords(BeanUtil.copyToList(result.getRecords(), cls));
         return rPage;
     }
 
-    public R one() {
+    public <R> R one(Class<R> cls) {
         Object result;
-        if (CharSequence.class.isAssignableFrom(sql.resultCls)
-                || Number.class.isAssignableFrom(sql.resultCls)
-                || Date.class.isAssignableFrom(sql.resultCls)) {
+        if (CharSequence.class.isAssignableFrom(cls)
+                || Number.class.isAssignableFrom(cls)
+                || Date.class.isAssignableFrom(cls)) {
             result = mapper.oneObj(sql);
         } else {
             result = mapper.oneMap(sql);
         }
 
-        return Convert.convert(sql.resultCls, result);
+        return Convert.convert(cls, result);
+    }
+
+    @Override
+    protected AbstractQueryColumn copy() {
+        return new SqlWrapper(sql);
+    }
+
+    @Override
+    public String toSql() {
+        return StringPool.LEFT_BRACKET + sql.toSql() + StringPool.RIGHT_BRACKET;
     }
 
 }

+ 7 - 22
my-test/src/test/java/MySpringBootTest.java

@@ -1,22 +1,17 @@
 import com.alibaba.fastjson.JSONObject;
 import org.dromara.system.domain.SysDept;
-import org.dromara.system.domain.SysUser;
-import org.dromara.system.mapper.SysUserMapper;
 import org.example.DromaraApplication;
 import org.example.join.model.QueryColumn;
 import org.example.join.model.Table;
 import org.example.join.sql.Sql;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
 import java.util.List;
 
-import static org.example.join.model.QueryMethod._if;
 import static org.example.join.model.QueryMethod.concat;
-import static org.example.join.model.QueryMethod.ifNull;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = DromaraApplication.class)
@@ -35,27 +30,23 @@ public class MySpringBootTest {
     public final QueryColumn sex = new QueryColumn(sys_user, "sex");
     public final QueryColumn create_by = new QueryColumn(sys_user, "create_by");
 
-    @Autowired
-    private SysUserMapper sysUserMapper;
-
     @Test
     public void testCache() {
 
-        List<SysUser> sysUsers = sysUserMapper.selectList();
-
-        List<SysDept> list = Sql.create(SysDept.class)
+        List<SysDept> list = Sql.create()
                 //.logic()
                 .select(
                         parent_id,
-                        _if(tenant_id.eq("000000"), "999999", "888888").as(SysDept::getTenantId),
+                        Sql.create().select(dept_id).from(sys_dept).limit(1).as("ccc"),
                         dept_id,
                         concat(0).as(SysDept::getAncestors)
                 )
-                .from(sys_dept)
+                .from(Sql.create().select(dept_id, tenant_id, parent_id, ancestors).from(sys_dept).asTable(sys_dept.getName()))
                 .leftJoin(sys_user).on(user_id.eq(dept_id))
                 .where(
-                        dept_id.isNull(),
-                        dept_id.eq(100)
+                        Sql.create().select(dept_id).from(sys_dept).limit(1).eq("sss")
+                        //dept_id.isNull(),
+                        //dept_id.eq(100)
                         //concat("777", "555").eq(create_by),
                         //create_by.eq(concat("777", "555").add(777)).and(concat("777", "555").eq("sss")),
                         //create_by.ne(98),
@@ -76,13 +67,7 @@ public class MySpringBootTest {
                         //create_by.in(1, 2, 3, 4),
                         //create_by.notIn(1, 2, 3, 4)
                 )
-
-                .union()
-
-                .select(parent_id, tenant_id, ifNull(dept_id, 0), concat(1).as(SysDept::getAncestors))
-                .from(sys_dept)
-                .leftJoin(sys_user).on(user_id.eq(dept_id))
-                .list();
+                .list(SysDept.class);
 
         System.out.println(JSONObject.toJSONString(list));