Browse Source

代码优化:内部类调整

mxd 4 years ago
parent
commit
7347d031d3

+ 2 - 2
src/main/java/org/ssssssss/magicapi/cache/SqlCache.java

@@ -1,7 +1,7 @@
 package org.ssssssss.magicapi.cache;
 
+import org.ssssssss.magicapi.functions.BoundSql;
 import org.ssssssss.magicapi.utils.MD5Utils;
-import org.ssssssss.magicapi.functions.DatabaseQuery;
 
 import java.util.Arrays;
 
@@ -13,7 +13,7 @@ public interface SqlCache {
     /**
      * 计算key
      */
-    default String buildSqlCacheKey(DatabaseQuery.BoundSql boundSql) {
+    default String buildSqlCacheKey(BoundSql boundSql) {
         return MD5Utils.encrypt(boundSql.getSql() + ":" + Arrays.toString(boundSql.getParameters()));
     }
 

+ 0 - 1
src/main/java/org/ssssssss/magicapi/config/WebUIController.java

@@ -5,7 +5,6 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.slf4j.MDC;
 import org.springframework.core.io.InputStreamSource;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.RequestBody;

+ 3 - 2
src/main/java/org/ssssssss/magicapi/dialect/DB2Dialect.java

@@ -1,10 +1,11 @@
 package org.ssssssss.magicapi.dialect;
 
-import org.ssssssss.magicapi.functions.DatabaseQuery;
+
+import org.ssssssss.magicapi.functions.BoundSql;
 
 public class DB2Dialect implements Dialect {
     @Override
-    public String getPageSql(String sql, DatabaseQuery.BoundSql boundSql, long offset, long limit) {
+    public String getPageSql(String sql, BoundSql boundSql, long offset, long limit) {
         boundSql.addParameter(offset + 1);
         boundSql.addParameter(offset + limit);
         return "SELECT * FROM (SELECT TMP_PAGE.*,ROWNUMBER() OVER() AS ROW_ID FROM ( " + sql +

+ 3 - 2
src/main/java/org/ssssssss/magicapi/dialect/Dialect.java

@@ -1,6 +1,7 @@
 package org.ssssssss.magicapi.dialect;
 
-import org.ssssssss.magicapi.functions.DatabaseQuery;
+
+import org.ssssssss.magicapi.functions.BoundSql;
 
 public interface Dialect {
 
@@ -14,5 +15,5 @@ public interface Dialect {
     /**
      * 获取分页sql
      */
-    String getPageSql(String sql, DatabaseQuery.BoundSql boundSql, long offset, long limit);
+    String getPageSql(String sql, BoundSql boundSql, long offset, long limit);
 }

+ 3 - 2
src/main/java/org/ssssssss/magicapi/dialect/MySQLDialect.java

@@ -1,11 +1,12 @@
 package org.ssssssss.magicapi.dialect;
 
-import org.ssssssss.magicapi.functions.DatabaseQuery;
+
+import org.ssssssss.magicapi.functions.BoundSql;
 
 public class MySQLDialect implements Dialect {
 
     @Override
-    public String getPageSql(String sql, DatabaseQuery.BoundSql boundSql, long offset, long limit) {
+    public String getPageSql(String sql, BoundSql boundSql, long offset, long limit) {
         boundSql.addParameter(offset);
         boundSql.addParameter(limit);
         return sql + " limit ?,?";

+ 3 - 2
src/main/java/org/ssssssss/magicapi/dialect/OracleDialect.java

@@ -1,11 +1,12 @@
 package org.ssssssss.magicapi.dialect;
 
-import org.ssssssss.magicapi.functions.DatabaseQuery;
+
+import org.ssssssss.magicapi.functions.BoundSql;
 
 public class OracleDialect implements Dialect {
 
     @Override
-    public String getPageSql(String sql, DatabaseQuery.BoundSql boundSql, long offset, long limit) {
+    public String getPageSql(String sql, BoundSql boundSql, long offset, long limit) {
         limit = (offset >= 1) ? (offset + limit) : limit;
         boundSql.addParameter(limit);
         boundSql.addParameter(offset);

+ 3 - 2
src/main/java/org/ssssssss/magicapi/dialect/PostgreSQLDialect.java

@@ -1,10 +1,11 @@
 package org.ssssssss.magicapi.dialect;
 
-import org.ssssssss.magicapi.functions.DatabaseQuery;
+
+import org.ssssssss.magicapi.functions.BoundSql;
 
 public class PostgreSQLDialect implements Dialect {
     @Override
-    public String getPageSql(String sql, DatabaseQuery.BoundSql boundSql, long offset, long limit) {
+    public String getPageSql(String sql, BoundSql boundSql, long offset, long limit) {
         boundSql.addParameter(limit);
         boundSql.addParameter(offset);
         return sql + " limit ? offset ?";

+ 2 - 2
src/main/java/org/ssssssss/magicapi/dialect/SQLServer2005Dialect.java

@@ -1,11 +1,11 @@
 package org.ssssssss.magicapi.dialect;
 
 import org.apache.commons.lang3.StringUtils;
-import org.ssssssss.magicapi.functions.DatabaseQuery;
+import org.ssssssss.magicapi.functions.BoundSql;
 
 public class SQLServer2005Dialect implements Dialect {
     @Override
-    public String getPageSql(String sql, DatabaseQuery.BoundSql boundSql, long offset, long limit) {
+    public String getPageSql(String sql, BoundSql boundSql, long offset, long limit) {
         StringBuilder pagingBuilder = new StringBuilder();
         String orderby = getOrderByPart(sql);
         String distinctStr = "";

+ 3 - 2
src/main/java/org/ssssssss/magicapi/dialect/SQLServerDialect.java

@@ -1,10 +1,11 @@
 package org.ssssssss.magicapi.dialect;
 
-import org.ssssssss.magicapi.functions.DatabaseQuery;
+
+import org.ssssssss.magicapi.functions.BoundSql;
 
 public class SQLServerDialect implements Dialect {
     @Override
-    public String getPageSql(String sql, DatabaseQuery.BoundSql boundSql, long offset, long limit) {
+    public String getPageSql(String sql, BoundSql boundSql, long offset, long limit) {
         boundSql.addParameter(offset);
         boundSql.addParameter(limit);
         return sql + " OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";

+ 127 - 0
src/main/java/org/ssssssss/magicapi/functions/BoundSql.java

@@ -0,0 +1,127 @@
+package org.ssssssss.magicapi.functions;
+
+import org.ssssssss.magicapi.cache.SqlCache;
+import org.ssssssss.script.MagicScriptContext;
+import org.ssssssss.script.functions.StreamExtension;
+import org.ssssssss.script.parsing.GenericTokenParser;
+import org.ssssssss.script.parsing.Parser;
+import org.ssssssss.script.parsing.TokenStream;
+import org.ssssssss.script.parsing.Tokenizer;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+public class BoundSql {
+
+	private static final Tokenizer tokenizer = new Tokenizer();
+
+	private static final GenericTokenParser concatTokenParser = new GenericTokenParser("${", "}", false);
+
+	private static final GenericTokenParser replaceTokenParser = new GenericTokenParser("#{", "}", true);
+
+	private static final GenericTokenParser ifTokenParser = new GenericTokenParser("?{", "}", true);
+
+	private static final GenericTokenParser ifParamTokenParser = new GenericTokenParser("?{", ",", true);
+
+	private String sql;
+
+	private List<Object> parameters = new ArrayList<>();
+
+	private String cacheKey;
+
+
+	BoundSql(String sql) {
+		MagicScriptContext context = MagicScriptContext.get();
+		// 处理?{}参数
+		this.sql = ifTokenParser.parse(sql.trim(), text -> {
+			AtomicBoolean ifTrue = new AtomicBoolean(false);
+			String val = ifParamTokenParser.parse("?{" + text, param -> {
+				Object result = Parser.parseExpression(new TokenStream(tokenizer.tokenize(param))).evaluate(context);
+				//如果是String则判断是否是空,否则和判断值是否为true
+				if (result != null) {
+					if (result instanceof String) {
+						ifTrue.set(!result.toString().isEmpty());
+					} else {
+						ifTrue.set(!Objects.equals(false, result));
+					}
+				}
+				return null;
+			});
+			if (ifTrue.get()) {
+				return val;
+			}
+			return "";
+		});
+		// 处理${}参数
+		this.sql = concatTokenParser.parse(this.sql, text -> String.valueOf(Parser.parseExpression(new TokenStream(tokenizer.tokenize(text))).evaluate(context)));
+		// 处理#{}参数
+		this.sql = replaceTokenParser.parse(this.sql, text -> {
+			Object value = Parser.parseExpression(new TokenStream(tokenizer.tokenize(text))).evaluate(context);
+			try {
+				//对集合自动展开
+				List<Object> objects = StreamExtension.arrayLikeToList(value);
+				StringBuilder sb = new StringBuilder();
+				for (int i = 0, size = objects.size(); i < size; i++) {
+					sb.append("?");
+					if (i + 1 < size) {
+						sb.append(",");
+					}
+					parameters.add(objects.get(i));
+				}
+				return sb.toString();
+			} catch (Exception e) {
+				parameters.add(value);
+				return "?";
+			}
+		});
+	}
+
+	/**
+	 * 添加SQL参数
+	 */
+	public void addParameter(Object value) {
+		parameters.add(value);
+	}
+
+	/**
+	 * 获取要执行的SQL
+	 */
+	public String getSql() {
+		return sql;
+	}
+
+	/**
+	 * 获取要执行的参数
+	 */
+	public Object[] getParameters() {
+		return parameters.toArray();
+	}
+
+	/**
+	 * 清空缓存key
+	 */
+	public BoundSql removeCacheKey() {
+		this.cacheKey = null;
+		return this;
+	}
+
+	/**
+	 * 获取缓存key
+	 */
+	public String getCacheKey(SqlCache sqlCache) {
+		if (cacheKey == null) {
+			cacheKey = sqlCache.buildSqlCacheKey(this);
+		}
+		return cacheKey;
+	}
+
+	/**
+	 * 获取缓存值
+	 */
+	public <T> Optional<T> getCacheValue(SqlCache sqlCache, String cacheName) {
+		return Optional.ofNullable(cacheName == null ? null : sqlCache.get(cacheName, getCacheKey(sqlCache)));
+	}
+}

+ 4 - 118
src/main/java/org/ssssssss/magicapi/functions/DatabaseQuery.java

@@ -1,14 +1,13 @@
 package org.ssssssss.magicapi.functions;
 
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.jdbc.core.ArgumentPreparedStatementSetter;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.jdbc.datasource.DataSourceUtils;
 import org.springframework.jdbc.support.GeneratedKeyHolder;
 import org.springframework.jdbc.support.KeyHolder;
 import org.ssssssss.magicapi.cache.SqlCache;
-import org.ssssssss.magicapi.config.MagicDynamicDataSource;
 import org.ssssssss.magicapi.config.DynamicDataSource.DataSourceNode;
+import org.ssssssss.magicapi.config.MagicDynamicDataSource;
 import org.ssssssss.magicapi.config.MagicModule;
 import org.ssssssss.magicapi.dialect.Dialect;
 import org.ssssssss.magicapi.dialect.DialectUtils;
@@ -18,17 +17,13 @@ import org.ssssssss.magicapi.provider.PageProvider;
 import org.ssssssss.magicapi.provider.ResultProvider;
 import org.ssssssss.script.MagicScriptContext;
 import org.ssssssss.script.annotation.UnableCall;
-import org.ssssssss.script.functions.StreamExtension;
-import org.ssssssss.script.parsing.GenericTokenParser;
-import org.ssssssss.script.parsing.Parser;
-import org.ssssssss.script.parsing.TokenStream;
-import org.ssssssss.script.parsing.Tokenizer;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.Statement;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.function.Function;
 
 /**
@@ -372,119 +367,10 @@ public class DatabaseQuery extends HashMap<String, DatabaseQuery> implements Mag
 				.orElseGet(() -> putCacheValue(dataSourceNode.getJdbcTemplate().queryForObject(boundSql.getSql(), boundSql.getParameters(), Object.class), boundSql));
 	}
 
-	private static Tokenizer tokenizer = new Tokenizer();
-
-	private static GenericTokenParser concatTokenParser = new GenericTokenParser("${", "}", false);
-
-	private static GenericTokenParser replaceTokenParser = new GenericTokenParser("#{", "}", true);
-
-	private static GenericTokenParser ifTokenParser = new GenericTokenParser("?{", "}", true);
-
-	private static GenericTokenParser ifParamTokenParser = new GenericTokenParser("?{", ",", true);
-
 	@UnableCall
 	@Override
 	public String getModuleName() {
 		return "db";
 	}
 
-	public static class BoundSql {
-		private String sql;
-		private List<Object> parameters = new ArrayList<>();
-		private String cacheKey;
-
-
-		BoundSql(String sql) {
-			MagicScriptContext context = MagicScriptContext.get();
-			// 处理?{}参数
-			this.sql = ifTokenParser.parse(sql.trim(), text -> {
-				AtomicBoolean ifTrue = new AtomicBoolean(false);
-				String val = ifParamTokenParser.parse("?{" + text, param -> {
-					Object result = Parser.parseExpression(new TokenStream(tokenizer.tokenize(param))).evaluate(context);
-					//如果是String则判断是否是空,否则和判断值是否为true
-					if (result != null) {
-						if (result instanceof String) {
-							ifTrue.set(!result.toString().isEmpty());
-						} else {
-							ifTrue.set(!Objects.equals(false, result));
-						}
-					}
-					return null;
-				});
-				if (ifTrue.get()) {
-					return val;
-				}
-				return "";
-			});
-			// 处理${}参数
-			this.sql = concatTokenParser.parse(this.sql, text -> String.valueOf(Parser.parseExpression(new TokenStream(tokenizer.tokenize(text))).evaluate(context)));
-			// 处理#{}参数
-			this.sql = replaceTokenParser.parse(this.sql, text -> {
-				Object value = Parser.parseExpression(new TokenStream(tokenizer.tokenize(text))).evaluate(context);
-				try {
-					//对集合自动展开
-					List<Object> objects = StreamExtension.arrayLikeToList(value);
-					StringBuilder sb = new StringBuilder();
-					for (int i = 0, size = objects.size(); i < size; i++) {
-						sb.append("?");
-						if (i + 1 < size) {
-							sb.append(",");
-						}
-						parameters.add(objects.get(i));
-					}
-					return sb.toString();
-				} catch (Exception e) {
-					parameters.add(value);
-					return "?";
-				}
-			});
-		}
-
-		/**
-		 * 添加SQL参数
-		 */
-		public void addParameter(Object value) {
-			parameters.add(value);
-		}
-
-		/**
-		 * 获取要执行的SQL
-		 */
-		public String getSql() {
-			return sql;
-		}
-
-		/**
-		 * 获取要执行的参数
-		 */
-		public Object[] getParameters() {
-			return parameters.toArray();
-		}
-
-		/**
-		 * 清空缓存key
-		 */
-		public BoundSql removeCacheKey() {
-			this.cacheKey = null;
-			return this;
-		}
-
-		/**
-		 * 获取缓存key
-		 */
-		public String getCacheKey(SqlCache sqlCache) {
-			if (cacheKey == null) {
-				cacheKey = sqlCache.buildSqlCacheKey(this);
-			}
-			return cacheKey;
-		}
-
-		/**
-		 * 获取缓存值
-		 */
-		public <T> Optional<T> getCacheValue(SqlCache sqlCache, String cacheName) {
-			return Optional.ofNullable(cacheName == null ? null : sqlCache.get(cacheName, getCacheKey(sqlCache)));
-		}
-	}
-
 }