Pārlūkot izejas kodu

新增`SQL`后置拦截器 https://gitee.com/ssssssss-team/magic-api/issues/I4NU79

mxd 3 gadi atpakaļ
vecāks
revīzija
e212841f06

+ 14 - 1
magic-api/src/main/java/org/ssssssss/magicapi/interceptor/SQLInterceptor.java

@@ -13,10 +13,23 @@ public interface SQLInterceptor {
 	/**
 	 * 1.1.1 新增
 	 *
+	 * @since 1.1.1
 	 * @param boundSql      SQL信息
 	 * @param requestEntity 请求信息
 	 */
-	void preHandle(BoundSql boundSql, RequestEntity requestEntity);
+	default void preHandle(BoundSql boundSql, RequestEntity requestEntity) {
+
+	}
+
+	/**
+	 * @since 1.7.2
+	 * @param boundSql	SQL信息
+	 * @param result	执行结果
+	 * @param requestEntity	请求信息
+	 */
+	default Object postHandle(BoundSql boundSql, Object result, RequestEntity requestEntity){
+		return result;
+	}
 
 
 }

+ 14 - 4
magic-api/src/main/java/org/ssssssss/magicapi/modules/BoundSql.java

@@ -2,6 +2,7 @@ package org.ssssssss.magicapi.modules;
 
 import org.ssssssss.magicapi.context.RequestContext;
 import org.ssssssss.magicapi.interceptor.SQLInterceptor;
+import org.ssssssss.magicapi.model.RequestEntity;
 import org.ssssssss.magicapi.modules.mybatis.MybatisParser;
 import org.ssssssss.magicapi.modules.mybatis.SqlNode;
 import org.ssssssss.script.MagicScriptContext;
@@ -211,8 +212,17 @@ public class BoundSql {
 	/**
 	 * 获取缓存值
 	 */
-	<T> T getCacheValue(List<SQLInterceptor> interceptors, Supplier<T> supplier) {
-		interceptors.forEach(interceptor -> interceptor.preHandle(this, RequestContext.getRequestEntity()));
-		return getCacheValue(this.getSql(), this.getParameters(), supplier);
+	@SuppressWarnings("unchecked")
+	<T> T execute(List<SQLInterceptor> interceptors, Supplier<T> supplier) {
+		RequestEntity requestEntity = RequestContext.getRequestEntity();
+		interceptors.forEach(interceptor -> interceptor.preHandle(this, requestEntity));
+		Supplier<T> newSupplier = () -> {
+			Object result = supplier.get();
+			for (SQLInterceptor interceptor : interceptors) {
+				result = interceptor.postHandle(this, result, requestEntity);
+			}
+			return (T) result;
+		};
+		return getCacheValue(this.getSql(), this.getParameters(), newSupplier);
 	}
-}
+}

+ 5 - 5
magic-api/src/main/java/org/ssssssss/magicapi/modules/SQLModule.java

@@ -329,7 +329,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
 	@UnableCall
 	public List<Map<String, Object>> select(BoundSql boundSql) {
 		assertDatasourceNotNull();
-		return boundSql.getCacheValue(this.sqlInterceptors, () -> queryForList(boundSql));
+		return boundSql.execute(this.sqlInterceptors, () -> queryForList(boundSql));
 	}
 
 	private List<Map<String, Object>> queryForList(BoundSql boundSql) {
@@ -542,7 +542,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
 				dialect = dataSourceNode.getDialect(dialectAdapter);
 			}
 			BoundSql pageBoundSql = buildPageBoundSql(dialect, boundSql, page.getOffset(), page.getLimit());
-			list = pageBoundSql.getCacheValue(this.sqlInterceptors, () -> queryForList(pageBoundSql));
+			list = pageBoundSql.execute(this.sqlInterceptors, () -> queryForList(pageBoundSql));
 		}
 		RequestEntity requestEntity = RequestContext.getRequestEntity();
 		return resultProvider.buildPageResult(requestEntity, page, count, list);
@@ -579,7 +579,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
 	@UnableCall
 	public Integer selectInt(BoundSql boundSql) {
 		assertDatasourceNotNull();
-		return boundSql.getCacheValue(this.sqlInterceptors, () -> dataSourceNode.getJdbcTemplate().query(boundSql.getSql(), new SingleRowResultSetExtractor<>(Integer.class), boundSql.getParameters()));
+		return boundSql.execute(this.sqlInterceptors, () -> dataSourceNode.getJdbcTemplate().query(boundSql.getSql(), new SingleRowResultSetExtractor<>(Integer.class), boundSql.getParameters()));
 	}
 
 	/**
@@ -604,7 +604,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
 	@UnableCall
 	public Map<String, Object> selectOne(BoundSql boundSql) {
 		assertDatasourceNotNull();
-		return boundSql.getCacheValue(this.sqlInterceptors, () -> {
+		return boundSql.execute(this.sqlInterceptors, () -> {
 			Map<String, Object> row = dataSourceNode.getJdbcTemplate().query(boundSql.getSql(), new SingleRowResultSetExtractor<>(this.columnMapRowMapper), boundSql.getParameters());
 			if (row != null && boundSql.getExcludeColumns() != null) {
 				boundSql.getExcludeColumns().forEach(row::remove);
@@ -631,7 +631,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
 							  @Comment(name = "params", value = "变量信息") Map<String, Object> params) {
 		assertDatasourceNotNull();
 		BoundSql boundSql = new BoundSql(runtimeContext, sqlOrXml, params, this);
-		return boundSql.getCacheValue(this.sqlInterceptors, () -> dataSourceNode.getJdbcTemplate().query(boundSql.getSql(), new SingleRowResultSetExtractor<>(Object.class), boundSql.getParameters()));
+		return boundSql.execute(this.sqlInterceptors, () -> dataSourceNode.getJdbcTemplate().query(boundSql.getSql(), new SingleRowResultSetExtractor<>(Object.class), boundSql.getParameters()));
 	}
 
 	@Comment("指定table,进行单表操作")