فهرست منبع

函数代码提交

fgd 1 سال پیش
والد
کامیت
ee6e3e72e7

+ 47 - 0
my-test/src/main/java/org/example/join/domain/FunctionQueryColumn.java

@@ -0,0 +1,47 @@
+package org.example.join.domain;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.support.LambdaMeta;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import org.apache.ibatis.reflection.property.PropertyNamer;
+import org.example.join.util.SqlUtil;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class FunctionQueryColumn implements IFormat, IQueryColumn {
+
+    private final String fnName;
+
+    private final List<IQueryColumn> columns;
+
+    public FunctionQueryColumn(String fnName) {
+        this.fnName = fnName;
+        this.columns = new ArrayList<>();
+    }
+
+    public FunctionQueryColumn(String fnName, IQueryColumn... columns) {
+        this(fnName);
+        this.columns.addAll(Arrays.asList(columns));
+    }
+
+    public <T> QueryColumnAlias as(SFunction<T, ?> function) {
+        LambdaMeta meta = LambdaUtils.extract(function);
+        String alias = StrUtil.toUnderlineCase(PropertyNamer.methodToProperty(meta.getImplMethodName()));
+        return new QueryColumnAlias(alias, this);
+    }
+
+    @Override
+    public String toSql(Map<String, String> tableAliasMap, Map<String, Object> paramMap) {
+        StringJoiner joiner = new StringJoiner(StringPool.EMPTY);
+
+        String queryColumnStr = columns
+                .stream()
+                .map(item -> item.toSql(tableAliasMap, paramMap))
+                .collect(Collectors.joining(","));
+
+        return joiner.add(fnName).add(SqlUtil.withBracket(queryColumnStr)).toString();
+    }
+}

+ 1 - 1
my-test/src/main/java/org/example/join/domain/QueryColumnAlias.java

@@ -16,7 +16,7 @@ public class QueryColumnAlias implements IFormat, IQueryColumn {
     /**
      * 查询列
      */
-    private final QueryColumn queryColumn;
+    private final IQueryColumn queryColumn;
 
     @Override
     public String toSql(Map<String, String> tableAliasMap, Map<String, Object> paramMap) {

+ 184 - 0
my-test/src/main/java/org/example/join/domain/QueryMethods.java

@@ -0,0 +1,184 @@
+package org.example.join.domain;
+
+import cn.hutool.core.util.ArrayUtil;
+import org.example.join.util.SqlConstant;
+
+/**
+ * SQL 函数。
+ */
+public class QueryMethods {
+
+    /**
+     * 绝对值
+     */
+    public static FunctionQueryColumn abs(IQueryColumn queryColumn) {
+        return new FunctionQueryColumn(SqlConstant.ABS, queryColumn);
+    }
+
+    /**
+     * 平均值
+     */
+    public static FunctionQueryColumn avg(IQueryColumn queryColumn) {
+        return new FunctionQueryColumn(SqlConstant.AVG, queryColumn);
+    }
+
+    /**
+     * 数量
+     */
+    public static FunctionQueryColumn count(IQueryColumn queryColumn) {
+        return new FunctionQueryColumn(SqlConstant.COUNT, queryColumn);
+    }
+
+    /**
+     * 将字符串 s1,s2 等多个字符串合并为一个字符串。
+     */
+    public static FunctionQueryColumn concat(String queryColumnS1, String queryColumnS2, String... columnN) {
+        RawQueryColumn[] rawQueryColumns = new RawQueryColumn[columnN.length];
+        for (int i = 0; i < columnN.length; i++) {
+            rawQueryColumns[i] = string(columnN[i]);
+        }
+        return new FunctionQueryColumn(SqlConstant.CONCAT, ArrayUtil.addAll(new RawQueryColumn[]{string(queryColumnS1), string(queryColumnS2)}, rawQueryColumns));
+    }
+
+    /**
+     * 将字符串 s1,s2 等多个字符串合并为一个字符串。
+     */
+    public static FunctionQueryColumn concat(IQueryColumn queryColumnS1, IQueryColumn queryColumnS2, IQueryColumn... columnN) {
+        return new FunctionQueryColumn(SqlConstant.CONCAT, ArrayUtil.addAll(new IQueryColumn[]{queryColumnS1, queryColumnS2}, columnN));
+    }
+
+    /**
+     * 计算两个时间相差天数
+     */
+    public static FunctionQueryColumn dateDiff(IQueryColumn queryColumn1, IQueryColumn queryColumn2) {
+        return new FunctionQueryColumn(SqlConstant.DATEDIFF, queryColumn1, queryColumn2);
+    }
+
+    /**
+     * 计算两个时间相差天数
+     */
+    public static FunctionQueryColumn dateDiff(IQueryColumn queryColumn1, String queryColumn2) {
+        return new FunctionQueryColumn(SqlConstant.DATEDIFF, queryColumn1, string(queryColumn2));
+    }
+
+    /**
+     * 日期格式
+     */
+    public static FunctionQueryColumn dateFormat(IQueryColumn queryColumn, String format) {
+        return new FunctionQueryColumn(SqlConstant.DATE_FORMAT, queryColumn, string(format));
+    }
+
+    /**
+     * 日期格式
+     */
+    public static FunctionQueryColumn dateFormat(String queryColumn, String format) {
+        return new FunctionQueryColumn(SqlConstant.DATE_FORMAT, string(queryColumn), string(format));
+    }
+
+    /**
+     * 判断值是否为null
+     */
+    public static FunctionQueryColumn ifNull(IQueryColumn nullColumn, IQueryColumn elseColumn) {
+        return new FunctionQueryColumn(SqlConstant.IFNULL, nullColumn, elseColumn);
+    }
+
+    /**
+     * 判断值是否为null
+     */
+    public static FunctionQueryColumn ifNull(String nullColumn, String elseColumn) {
+        return new FunctionQueryColumn(SqlConstant.IFNULL, new RawQueryColumn(nullColumn), new RawQueryColumn(elseColumn));
+    }
+
+    /**
+     * 最大值
+     */
+    public static FunctionQueryColumn max(IQueryColumn queryColumn) {
+        return new FunctionQueryColumn(SqlConstant.MAX, queryColumn);
+    }
+
+    /**
+     * 最小值
+     */
+    public static FunctionQueryColumn min(IQueryColumn queryColumn) {
+        return new FunctionQueryColumn(SqlConstant.MIN, queryColumn);
+    }
+
+    /**
+     * 当前系统时间
+     */
+    public static FunctionQueryColumn now() {
+        return new FunctionQueryColumn(SqlConstant.NOW);
+    }
+
+    /**
+     * 替换字符串
+     */
+    public static FunctionQueryColumn replace(IQueryColumn queryColumn, String fromColumn, String toColumn) {
+        return new FunctionQueryColumn(SqlConstant.REPLACE, queryColumn, string(fromColumn), string(toColumn));
+    }
+
+    /**
+     * 四舍五入
+     */
+    public static FunctionQueryColumn round(IQueryColumn queryColumn, Number number) {
+        return new FunctionQueryColumn(SqlConstant.ROUND, queryColumn, number(number));
+    }
+
+    /**
+     * 截取字符串
+     */
+    public static FunctionQueryColumn substr(IQueryColumn queryColumn, int position) {
+        return new FunctionQueryColumn(SqlConstant.SUBSTR, queryColumn, number(position));
+    }
+
+    /**
+     * 截取字符串
+     */
+    public static FunctionQueryColumn substr(IQueryColumn queryColumn, int position, int length) {
+        return new FunctionQueryColumn(SqlConstant.SUBSTR, queryColumn, number(position), number(length));
+    }
+
+    /**
+     * 获取年
+     */
+    public static FunctionQueryColumn year(IQueryColumn queryColumn) {
+        return new FunctionQueryColumn(SqlConstant.YEAR, queryColumn);
+    }
+
+    /**
+     * 获取月
+     */
+    public static FunctionQueryColumn month(IQueryColumn queryColumn) {
+        return new FunctionQueryColumn(SqlConstant.MONTH, queryColumn);
+    }
+
+    /**
+     * 获取日
+     */
+    public static FunctionQueryColumn day(IQueryColumn queryColumn) {
+        return new FunctionQueryColumn(SqlConstant.DAY, queryColumn);
+    }
+
+    /**
+     * 获取小时
+     */
+    public static FunctionQueryColumn hour(IQueryColumn queryColumn) {
+        return new FunctionQueryColumn(SqlConstant.HOUR, queryColumn);
+    }
+
+
+    /**
+     * 构建数字常量。
+     */
+    public static RawQueryColumn number(Number n) {
+        return new RawQueryColumn(n);
+    }
+
+    /**
+     * 构建字符常量。
+     */
+    public static RawQueryColumn string(String s) {
+        return new RawQueryColumn("'" + s + "'");
+    }
+
+}

+ 17 - 0
my-test/src/main/java/org/example/join/domain/RawQueryColumn.java

@@ -0,0 +1,17 @@
+package org.example.join.domain;
+
+import java.util.Map;
+
+public class RawQueryColumn implements IFormat, IQueryColumn {
+
+    private final String content;
+
+    public RawQueryColumn(Object content) {
+        this.content = String.valueOf(content);
+    }
+
+    @Override
+    public String toSql(Map<String, String> tableAliasMap, Map<String, Object> paramMap) {
+        return content;
+    }
+}

+ 21 - 0
my-test/src/main/java/org/example/join/util/SqlConstant.java

@@ -41,4 +41,25 @@ public interface SqlConstant {
     String IN = " in ";
     String NOT_IN = " not in ";
 
+
+    /**
+     * 函数关键字
+     */
+    String ABS = "ABS";
+    String AVG = "AVG";
+    String COUNT = "COUNT";
+    String CONCAT = "CONCAT";
+    String DATEDIFF = "DATEDIFF";
+    String DATE_FORMAT = "DATE_FORMAT";
+    String IFNULL = "IFNULL";
+    String MAX = "MAX";
+    String MIN = "MIN";
+    String NOW = "NOW";
+    String REPLACE = "REPLACE";
+    String ROUND = "ROUND";
+    String SUBSTR = "SUBSTR";
+    String YEAR = "YEAR";
+    String MONTH = "MONTH";
+    String DAY = "DAY";
+    String HOUR = "HOUR";
 }

+ 4 - 0
my-test/src/main/java/org/example/join/util/SqlUtil.java

@@ -39,4 +39,8 @@ public class SqlUtil {
         });
     }
 
+    public static String withBracket(String sql) {
+        return StringPool.LEFT_BRACKET + sql + StringPool.RIGHT_BRACKET;
+    }
+
 }

+ 9 - 2
my-test/src/test/java/MySpringBootTest.java

@@ -13,6 +13,7 @@ import org.springframework.test.context.junit4.SpringRunner;
 
 import java.util.List;
 
+import static org.example.join.domain.QueryMethods.*;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = DromaraApplication.class)
@@ -40,8 +41,14 @@ public class MySpringBootTest {
         List<SysDept> list = Sql.create(SysDept.class)
                 //.logicIgnore()
                 .select(
-                        dept_id,
-                        tenant_id.as(SysDept::getEmail)
+                        dept_id.as(SysDept::getEmail),
+                        abs(parent_id).as(SysDept::getUpdateTime),
+                        replace(dept_id, "2", "3"),
+                        concat("@","1"),
+                        concat("dept_id","@","1"),
+                        concat(dept_id, parent_id),
+                        dateFormat(now(), "%Y%m"),
+                        ifNull("2","2")
                 )
                 .from(sys_dept)
                 .leftJoin(sys_user).on(user_id.eq(dept_id))