24282 před 1 rokem
rodič
revize
8bf6be82c0

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

@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.SelectProvider;
-import org.example.join.sql.JoinSqlProvider;
+import org.example.join.sql.SqlProvider;
 import org.example.join.sql.Sql;
 
 import java.util.List;
@@ -17,37 +17,37 @@ public interface JoinMapper {
     /**
      * 列表
      */
-    @SelectProvider(type = JoinSqlProvider.class, method = "getSql")
+    @SelectProvider(type = SqlProvider.class, method = "getSql")
     List<Map<String, Object>> listMap(@Param(ISqlRunner.SQL) Sql<?> sql);
 
     /**
      * 分页
      */
-    @SelectProvider(type = JoinSqlProvider.class, method = "getSql")
+    @SelectProvider(type = SqlProvider.class, method = "getSql")
     Page<Map<String, Object>> pageMap(@Param(ISqlRunner.SQL) Sql<?> sql, @Param(ISqlRunner.PAGE) Page<?> page);
 
     /**
      * 单条纪录
      */
-    @SelectProvider(type = JoinSqlProvider.class, method = "getSql")
+    @SelectProvider(type = SqlProvider.class, method = "getSql")
     Map<String, Object> oneMap(@Param(ISqlRunner.SQL) Sql<?> sql);
 
     /**
      * 列表
      */
-    @SelectProvider(type = JoinSqlProvider.class, method = "getSql")
+    @SelectProvider(type = SqlProvider.class, method = "getSql")
     List<Object> listObj(@Param(ISqlRunner.SQL) Sql<?> sql);
 
     /**
      * 分页
      */
-    @SelectProvider(type = JoinSqlProvider.class, method = "getSql")
+    @SelectProvider(type = SqlProvider.class, method = "getSql")
     Page<Object> pageObj(@Param(ISqlRunner.SQL) Sql<?> sql, @Param(ISqlRunner.PAGE) Page<?> page);
 
     /**
      * 单条纪录
      */
-    @SelectProvider(type = JoinSqlProvider.class, method = "getSql")
+    @SelectProvider(type = SqlProvider.class, method = "getSql")
     Object oneObj(@Param(ISqlRunner.SQL) Sql<?> sql);
 
 }

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

@@ -1,14 +1,9 @@
 package org.example.join.sql;
 
-import cn.hutool.core.util.ObjectUtil;
-import org.example.join.domain.QueryCondition;
 import org.example.join.domain.Table;
 import org.example.join.util.SqlConstant;
 
-import java.util.Arrays;
-import java.util.Objects;
-
-public class From<R> extends SqlExecute<R> {
+public class From<R> extends SqlWrapper<R> {
 
     private final Sql<R> sql;
 
@@ -18,22 +13,15 @@ public class From<R> extends SqlExecute<R> {
     }
 
     public Join<R> innerJoin(Table table) {
-        return new Join<>(sql, SqlConstant.INNER_JOIN, table);
+        return new Join<>(this, sql, SqlConstant.INNER_JOIN, table);
     }
 
     public Join<R> leftJoin(Table table) {
-        return new Join<>(sql, SqlConstant.LEFT_JOIN, table);
+        return new Join<>(this, sql, SqlConstant.LEFT_JOIN, table);
     }
 
     public Join<R> rightJoin(Table table) {
-        return new Join<>(sql, SqlConstant.RIGHT_JOIN, table);
-    }
-
-    public Where<R> where(QueryCondition... queryCondition) {
-        if (ObjectUtil.isNotEmpty(queryCondition)) {
-            sql.queryConditionList.addAll(Arrays.stream(queryCondition).filter(Objects::nonNull).toList());
-        }
-        return new Where<>(sql);
+        return new Join<>(this, sql, SqlConstant.RIGHT_JOIN, table);
     }
 
 }

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

@@ -1,6 +1,8 @@
 package org.example.join.sql;
 
 import cn.hutool.core.util.ObjectUtil;
+import lombok.AccessLevel;
+import lombok.RequiredArgsConstructor;
 import org.example.join.domain.QueryCondition;
 import org.example.join.domain.Table;
 import org.example.join.domain.TableJoin;
@@ -10,18 +12,14 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 
+@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
 public class Join<R> {
 
+    private final From<R> from;
     private final Sql<R> sql;
     private final String join;
     private final Table table;
 
-    protected Join(Sql<R> sql, String join, Table table) {
-        this.sql = sql;
-        this.join = join;
-        this.table = table;
-    }
-
     public From<R> on(QueryCondition... queryConditions) {
         if (ObjectUtil.isEmpty(queryConditions)) {
             throw new IllegalArgumentException("on不能为空");
@@ -33,10 +31,9 @@ public class Join<R> {
             throw new IllegalArgumentException("on不能为空");
         }
 
-        TableJoin tableJoin = new TableJoin(join, table, queryConditionList);
-        sql.queryTableList.add(tableJoin);
+        sql.queryTableList.add(new TableJoin(join, table, queryConditionList));
 
-        return new From<>(sql);
+        return from;
     }
 
 }

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

@@ -1,21 +1,16 @@
 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.domain.IQueryColumn;
 import org.example.join.domain.Table;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-
+@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
 public class Select<R> {
 
     private final Sql<R> sql;
 
-    protected Select(Sql<R> sql) {
-        this.sql = sql;
-    }
-
     /**
      * 去重
      */
@@ -41,22 +36,12 @@ public class Select<R> {
     }
 
     public Select<R> select(IQueryColumn... columns) {
-
-        if (ObjectUtil.isEmpty(columns)) {
-            throw new IllegalArgumentException("select不能为空");
-        }
-
-        List<IQueryColumn> list = Arrays.stream(columns).filter(Objects::nonNull).toList();
-        if (list.isEmpty()) {
-            throw new IllegalArgumentException("select不能为空");
-        }
-
-        sql.queryFieldsList.addAll(list);
+        sql.queryFieldsList.addAll(ListUtil.toList(columns));
         return this;
     }
 
     public From<R> from(Table... tables) {
-        sql.queryTableList.addAll(Arrays.asList(tables));
+        sql.queryTableList.addAll(ListUtil.toList(tables));
         return new From<>(sql);
     }
 

+ 3 - 4
my-test/src/main/java/org/example/join/sql/Sql.java

@@ -1,6 +1,8 @@
 package org.example.join.sql;
 
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import lombok.AccessLevel;
+import lombok.RequiredArgsConstructor;
 import org.example.join.domain.IQueryColumn;
 import org.example.join.domain.ITable;
 import org.example.join.domain.QueryColumn;
@@ -10,6 +12,7 @@ import org.example.join.domain.QueryConditionOrder;
 import java.util.ArrayList;
 import java.util.List;
 
+@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
 public class Sql<R> {
 
     protected final Class<R> resultCls;
@@ -23,10 +26,6 @@ public class Sql<R> {
     protected Boolean logic = false;
     protected String limit = StringPool.EMPTY;
 
-    protected Sql(Class<R> resultCls) {
-        this.resultCls = resultCls;
-    }
-
     public static <R> Select<R> create(Class<R> cls) {
         return new Select<>(new Sql<>(cls));
     }

+ 1 - 0
my-test/src/main/java/org/example/join/sql/SqlContext.java

@@ -11,6 +11,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+@SuppressWarnings("unchecked")
 public class SqlContext {
 
     private static final ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();

+ 0 - 68
my-test/src/main/java/org/example/join/sql/SqlExecute.java

@@ -1,68 +0,0 @@
-package org.example.join.sql;
-
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.convert.Convert;
-import cn.hutool.extra.spring.SpringUtil;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.AllArgsConstructor;
-import org.example.join.JoinMapper;
-
-import java.util.Date;
-import java.util.List;
-
-@AllArgsConstructor
-public class SqlExecute<R> {
-
-    protected static final JoinMapper mapper = SpringUtil.getBean(JoinMapper.class);
-
-    private final Sql<R> sql;
-
-    public List<R> list() {
-        List<?> result;
-
-        if (String.class.isAssignableFrom(sql.resultCls)
-                || Number.class.isAssignableFrom(sql.resultCls)
-                || Date.class.isAssignableFrom(sql.resultCls)) {
-            result = mapper.listObj(sql);
-        } else {
-            result = mapper.listMap(sql);
-        }
-
-        return BeanUtil.copyToList(result, sql.resultCls);
-    }
-
-    public Page<R> page(Page<?> page) {
-        Page<?> result;
-
-        if (String.class.isAssignableFrom(sql.resultCls)
-                || Number.class.isAssignableFrom(sql.resultCls)
-                || Date.class.isAssignableFrom(sql.resultCls)) {
-            result = mapper.pageObj(sql, page);
-        } else {
-            result = mapper.pageMap(sql, page);
-        }
-
-        Page<R> rPage = new Page<>();
-        rPage.setPages(result.getPages());
-        rPage.setCurrent(result.getCurrent());
-        rPage.setSize(result.getSize());
-        rPage.setTotal(result.getTotal());
-        rPage.setRecords(BeanUtil.copyToList(result.getRecords(), sql.resultCls));
-        return rPage;
-    }
-
-    public R one() {
-        Object result;
-
-        if (String.class.isAssignableFrom(sql.resultCls)
-                || Number.class.isAssignableFrom(sql.resultCls)
-                || Date.class.isAssignableFrom(sql.resultCls)) {
-            result = mapper.oneObj(sql);
-        } else {
-            result = mapper.oneMap(sql);
-        }
-
-        return Convert.convert(sql.resultCls, result);
-    }
-
-}

+ 8 - 7
my-test/src/main/java/org/example/join/sql/JoinSqlProvider.java → my-test/src/main/java/org/example/join/sql/SqlProvider.java

@@ -17,9 +17,10 @@ import org.example.join.util.SqlUtil;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
-public class JoinSqlProvider {
+public class SqlProvider {
 
     public static String getSql(Map<String, Object> paramMap) {
         Sql<?> sql = (Sql<?>) paramMap.get(ISqlRunner.SQL);
@@ -80,25 +81,24 @@ public class JoinSqlProvider {
         List<QueryColumn> groupByList = sql.groupByList;
         List<QueryConditionOrder> orderByList = sql.orderByList;
 
-        StringBuilder sqlBuilder = new StringBuilder();
-        sqlBuilder
+        StringBuilder sqlBuilder = new StringBuilder()
                 .append(SqlConstant.SELECT)
                 .append(listFormatSql(queryFieldsList, StringPool.COMMA))
                 .append(SqlConstant.FROM)
                 .append(getQueryTablesSql(queryTableList));
 
         String where = listFormatSql(queryConditionList, SqlConstant.AND);
-        if (StrUtil.isNotEmpty(where)) {
+        if (StrUtil.isNotBlank(where)) {
             sqlBuilder.append(SqlConstant.WHERE).append(where);
         }
 
         String groupBy = listFormatSql(groupByList, StringPool.COMMA);
-        if (StrUtil.isNotEmpty(groupBy)) {
+        if (StrUtil.isNotBlank(groupBy)) {
             sqlBuilder.append(SqlConstant.GROUP_BY).append(groupBy);
         }
 
         String orderBy = listFormatSql(orderByList, StringPool.COMMA);
-        if (StrUtil.isNotEmpty(orderBy)) {
+        if (StrUtil.isNotBlank(orderBy)) {
             sqlBuilder.append(SqlConstant.ORDER_BY).append(orderBy);
         }
 
@@ -124,8 +124,9 @@ public class JoinSqlProvider {
 
     private static String listFormatSql(List<? extends IFormat> list, String joinStr) {
         return list.stream()
+                .filter(Objects::nonNull)
                 .map(IFormat::toSql)
-                .filter(item -> ObjectUtil.notEqual(item, StringPool.EMPTY))
+                .filter(StrUtil::isNotEmpty)
                 .collect(Collectors.joining(joinStr));
     }
 

+ 120 - 0
my-test/src/main/java/org/example/join/sql/SqlWrapper.java

@@ -0,0 +1,120 @@
+package org.example.join.sql;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.AccessLevel;
+import lombok.RequiredArgsConstructor;
+import org.example.join.JoinMapper;
+import org.example.join.domain.QueryColumn;
+import org.example.join.domain.QueryCondition;
+import org.example.join.domain.QueryConditionOrder;
+import org.example.join.util.SqlConstant;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
+public class SqlWrapper<R> {
+
+    private static final JoinMapper mapper = SpringUtil.getBean(JoinMapper.class);
+
+    private final Sql<R> sql;
+
+    public SqlWrapper<R> where(QueryCondition... queryCondition) {
+        if (ObjectUtil.isNotEmpty(queryCondition)) {
+            sql.queryConditionList.addAll(ListUtil.toList(queryCondition));
+        }
+        return this;
+    }
+
+    public SqlWrapper<R> groupBy(QueryColumn... queryColumns) {
+        if (ObjectUtil.isNotEmpty(queryColumns)) {
+            sql.groupByList.addAll(ListUtil.toList(queryColumns));
+        }
+        return this;
+    }
+
+    public SqlWrapper<R> orderBy(QueryConditionOrder... queryConditionOrders) {
+        if (ObjectUtil.isNotEmpty(queryConditionOrders)) {
+            sql.orderByList.addAll(ListUtil.toList(queryConditionOrders));
+        }
+        return this;
+    }
+
+    public SqlWrapper<R> 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) {
+        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) {
+        sql.limit = SqlConstant.LIMIT + offset.longValue();
+        return this;
+    }
+
+    public SqlWrapper<R> limit(Number offset, Number rows) {
+        sql.limit = SqlConstant.LIMIT + offset.longValue() + StringPool.COMMA + rows.longValue();
+        return this;
+    }
+
+    public List<R> list() {
+        List<?> result;
+        if (CharSequence.class.isAssignableFrom(sql.resultCls)
+                || Number.class.isAssignableFrom(sql.resultCls)
+                || Date.class.isAssignableFrom(sql.resultCls)) {
+            result = mapper.listObj(sql);
+        } else {
+            result = mapper.listMap(sql);
+        }
+
+        return BeanUtil.copyToList(result, sql.resultCls);
+    }
+
+    public Page<R> page(Page<?> page) {
+        Page<?> result;
+        if (CharSequence.class.isAssignableFrom(sql.resultCls)
+                || Number.class.isAssignableFrom(sql.resultCls)
+                || Date.class.isAssignableFrom(sql.resultCls)) {
+            result = mapper.pageObj(sql, page);
+        } else {
+            result = mapper.pageMap(sql, page);
+        }
+
+        Page<R> rPage = new Page<>();
+        rPage.setPages(result.getPages());
+        rPage.setCurrent(result.getCurrent());
+        rPage.setSize(result.getSize());
+        rPage.setTotal(result.getTotal());
+        rPage.setRecords(BeanUtil.copyToList(result.getRecords(), sql.resultCls));
+        return rPage;
+    }
+
+    public R one() {
+        Object result;
+        if (CharSequence.class.isAssignableFrom(sql.resultCls)
+                || Number.class.isAssignableFrom(sql.resultCls)
+                || Date.class.isAssignableFrom(sql.resultCls)) {
+            result = mapper.oneObj(sql);
+        } else {
+            result = mapper.oneMap(sql);
+        }
+
+        return Convert.convert(sql.resultCls, result);
+    }
+
+}

+ 0 - 63
my-test/src/main/java/org/example/join/sql/Where.java

@@ -1,63 +0,0 @@
-package org.example.join.sql;
-
-import cn.hutool.core.util.ObjectUtil;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import org.example.join.domain.QueryColumn;
-import org.example.join.domain.QueryConditionOrder;
-import org.example.join.util.SqlConstant;
-
-import java.util.Arrays;
-import java.util.Objects;
-
-public class Where<R> extends SqlExecute<R> {
-
-    private final Sql<R> sql;
-
-    protected Where(Sql<R> sql) {
-        super(sql);
-        this.sql = sql;
-    }
-
-    public Where<R> groupBy(QueryColumn... queryColumns) {
-        if (ObjectUtil.isEmpty(queryColumns)) {
-            return this;
-        }
-        sql.groupByList.addAll(Arrays.stream(queryColumns).filter(Objects::nonNull).toList());
-        return this;
-    }
-
-    public Where<R> orderBy(QueryConditionOrder... queryConditionOrderBIES) {
-        if (ObjectUtil.isEmpty(queryConditionOrderBIES)) {
-            return this;
-        }
-        sql.orderByList.addAll(Arrays.stream(queryConditionOrderBIES).filter(Objects::nonNull).toList());
-        return this;
-    }
-
-    public Where<R> orderByAsc(QueryColumn... queryColumns) {
-        if (ObjectUtil.isEmpty(queryColumns)) {
-            return this;
-        }
-        sql.orderByList.addAll(Arrays.stream(queryColumns).filter(Objects::nonNull).map(QueryColumn::asc).toList());
-        return this;
-    }
-
-    public Where<R> orderByDesc(QueryColumn... queryColumns) {
-        if (ObjectUtil.isEmpty(queryColumns)) {
-            return this;
-        }
-        sql.orderByList.addAll(Arrays.stream(queryColumns).filter(Objects::nonNull).map(QueryColumn::desc).toList());
-        return this;
-    }
-
-    public Where<R> limit(Number offset) {
-        sql.limit = SqlConstant.LIMIT + offset.longValue();
-        return this;
-    }
-
-    public Where<R> limit(Number offset, Number rows) {
-        sql.limit = SqlConstant.LIMIT + offset.longValue() + StringPool.COMMA + rows.longValue();
-        return this;
-    }
-
-}

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

@@ -43,28 +43,28 @@ public class MySpringBootTest {
                 )
                 .from(sys_dept)
                 .leftJoin(sys_user).on(user_id.eq(dept_id))
-                .where(
-                        //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),
-                        //create_by.gt(98),
-                        //create_by.lt(98),
-                        //create_by.ge(98),
-                        //create_by.le(98),
-                        //create_by.between(1, 2),
-                        //create_by.notBetween(1, 2),
-                        //create_by.like(1),
-                        //create_by.notLike(1),
-                        //create_by.likeLeft(1),
-                        //create_by.notLikeLeft(1),
-                        //create_by.likeRight(1),
-                        //create_by.notLikeRight(1),
-                        //create_by.isNull(),
-                        //create_by.isNotNull(),
-                        //create_by.in(1, 2, 3, 4),
-                        //create_by.notIn(1, 2, 3, 4)
-                )
+                //.where(
+                //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),
+                //create_by.gt(98),
+                //create_by.lt(98),
+                //create_by.ge(98),
+                //create_by.le(98),
+                //create_by.between(1, 2),
+                //create_by.notBetween(1, 2),
+                //create_by.like(1),
+                //create_by.notLike(1),
+                //create_by.likeLeft(1),
+                //create_by.notLikeLeft(1),
+                //create_by.likeRight(1),
+                //create_by.notLikeRight(1),
+                //create_by.isNull(),
+                //create_by.isNotNull(),
+                //create_by.in(1, 2, 3, 4),
+                //create_by.notIn(1, 2, 3, 4)
+                //)
                 .orderByAsc(dept_id)
                 .groupBy(dept_id)
                 .limit(1)