Prechádzať zdrojové kódy

新增`SQL`日志打印配置

mxd 3 rokov pred
rodič
commit
892f6a3601

+ 6 - 5
magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java

@@ -46,10 +46,7 @@ import org.ssssssss.magicapi.config.*;
 import org.ssssssss.magicapi.controller.*;
 import org.ssssssss.magicapi.dialect.Dialect;
 import org.ssssssss.magicapi.exception.MagicAPIException;
-import org.ssssssss.magicapi.interceptor.AuthorizationInterceptor;
-import org.ssssssss.magicapi.interceptor.DefaultAuthorizationInterceptor;
-import org.ssssssss.magicapi.interceptor.RequestInterceptor;
-import org.ssssssss.magicapi.interceptor.SQLInterceptor;
+import org.ssssssss.magicapi.interceptor.*;
 import org.ssssssss.magicapi.logging.LoggerManager;
 import org.ssssssss.magicapi.model.Constants;
 import org.ssssssss.magicapi.modules.*;
@@ -408,7 +405,11 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon
 		}
 		sqlModule.setResultProvider(resultProvider);
 		sqlModule.setPageProvider(pageProvider);
-		sqlModule.setSqlInterceptors(sqlInterceptorsProvider.getIfAvailable(Collections::emptyList));
+		List<SQLInterceptor> sqlInterceptors = sqlInterceptorsProvider.getIfAvailable(ArrayList::new);
+		if(properties.isShowSql()){
+			sqlInterceptors.add(new DefaultSqlInterceptor());
+		}
+		sqlModule.setSqlInterceptors(sqlInterceptors);
 		ColumnMapperAdapter columnMapperAdapter = new ColumnMapperAdapter();
 		this.columnMapperProvidersProvider.getIfAvailable(Collections::emptyList).stream().filter(mapperProvider -> !"default".equals(mapperProvider.name())).forEach(columnMapperAdapter::add);
 		columnMapperAdapter.setDefault(properties.getSqlColumnCase());

+ 15 - 0
magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIProperties.java

@@ -102,6 +102,12 @@ public class MagicAPIProperties {
 	 */
 	private boolean showUrl = true;
 
+	/**
+	 * 是否要打印SQL
+	 * @since 1.5.0
+	 */
+	private boolean showSql = true;
+
 	@NestedConfigurationProperty
 	private SecurityConfig securityConfig = new SecurityConfig();
 
@@ -359,4 +365,13 @@ public class MagicAPIProperties {
 	public void setBackupConfig(BackupConfig backupConfig) {
 		this.backupConfig = backupConfig;
 	}
+
+	public boolean isShowSql() {
+		return showSql;
+	}
+
+	public void setShowSql(boolean showSql) {
+		this.showSql = showSql;
+	}
+
 }

+ 32 - 0
magic-api/src/main/java/org/ssssssss/magicapi/interceptor/DefaultSqlInterceptor.java

@@ -0,0 +1,32 @@
+package org.ssssssss.magicapi.interceptor;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.ssssssss.magicapi.model.RequestEntity;
+import org.ssssssss.magicapi.modules.BoundSql;
+import org.ssssssss.script.MagicScriptContext;
+
+import java.util.Arrays;
+import java.util.stream.Collectors;
+
+public class DefaultSqlInterceptor implements SQLInterceptor{
+
+	@Override
+	public void preHandle(BoundSql boundSql, RequestEntity requestEntity) {
+		Logger logger = LoggerFactory.getLogger(MagicScriptContext.get().getScriptName());
+		String parameters = Arrays.stream(boundSql.getParameters()).map(it -> {
+			if (it == null) {
+				return "null";
+			}
+			return it + "(" + it.getClass().getSimpleName() + ")";
+		}).collect(Collectors.joining(", "));
+		String dataSourceName = boundSql.getSqlModule().getDataSourceName();
+		logger.info("执行SQL:{}", boundSql.getSql().trim());
+		if(dataSourceName != null){
+			logger.info("数据源:{}", dataSourceName);
+		}
+		if(parameters.length() > 0){
+			logger.info("SQL参数:{}", parameters);
+		}
+	}
+}

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

@@ -33,23 +33,17 @@ public class BoundSql {
 
 	private List<Object> parameters = new ArrayList<>();
 
-	private SqlCache sqlCache;
-
-	private String cacheName;
-
-	private long ttl;
-
 	private Set<String> excludeColumns;
 
+	private SQLModule sqlModule;
+
 	public BoundSql(String sql, List<Object> parameters, SQLModule sqlModule) {
 		this.sql = sql;
 		this.parameters = parameters;
-		this.sqlCache = sqlModule.getSqlCache();
-		this.cacheName = sqlModule.getCacheName();
-		this.ttl = sqlModule.getTtl();
+		this.sqlModule = sqlModule;
 	}
 
-	BoundSql(String sql) {
+	private BoundSql(String sql) {
 		MagicScriptContext context = MagicScriptContext.get();
 		// 处理?{}参数
 		this.sql = ifTokenParser.parse(sql.trim(), text -> {
@@ -84,24 +78,24 @@ public class BoundSql {
 
 	BoundSql(String sql, SQLModule sqlModule) {
 		this(sql);
-		this.sqlCache = sqlModule.getSqlCache();
-		this.cacheName = sqlModule.getCacheName();
-		this.ttl = sqlModule.getTtl();
+		this.sqlModule = sqlModule;
 	}
 
 	private BoundSql() {
 
 	}
 
+	public SQLModule getSqlModule() {
+		return sqlModule;
+	}
+
 	BoundSql copy(String newSql) {
 		BoundSql boundSql = new BoundSql();
 		boundSql.setParameters(new ArrayList<>(this.parameters));
 		boundSql.setSql(this.sql);
-		boundSql.ttl = this.ttl;
-		boundSql.cacheName = this.cacheName;
-		boundSql.sqlCache = this.sqlCache;
 		boundSql.sql = newSql;
 		boundSql.excludeColumns = this.excludeColumns;
+		boundSql.sqlModule = this.sqlModule;
 		return boundSql;
 	}
 
@@ -153,16 +147,16 @@ public class BoundSql {
 	 */
 	@SuppressWarnings({"unchecked"})
 	private <T> T getCacheValue(String sql, Object[] params, Supplier<T> supplier) {
-		if (cacheName == null) {
+		if (sqlModule.getCacheName() == null) {
 			return supplier.get();
 		}
-		String cacheKey = sqlCache.buildSqlCacheKey(sql, params);
-		Object cacheValue = sqlCache.get(cacheName, cacheKey);
+		String cacheKey = sqlModule.getSqlCache().buildSqlCacheKey(sql, params);
+		Object cacheValue = sqlModule.getSqlCache().get(sqlModule.getCacheName(), cacheKey);
 		if (cacheValue != null) {
 			return (T) cacheValue;
 		}
 		T value = supplier.get();
-		sqlCache.put(cacheName, cacheKey, value, ttl);
+		sqlModule.getSqlCache().put(sqlModule.getCacheName(), cacheKey, value, sqlModule.getTtl());
 		return value;
 	}
 

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

@@ -342,7 +342,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
 	 */
 	@Comment("执行update操作,返回受影响行数")
 	public int update(@Comment("`SQL`语句") String sql) {
-		return update(new BoundSql(sql));
+		return update(new BoundSql(sql, this));
 	}
 
 	@UnableCall
@@ -362,7 +362,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
 	@Comment("执行insert操作,返回插入主键")
 	public long insert(@Comment("`SQL`语句") String sql) {
 		MagicKeyHolder magicKeyHolder = new MagicKeyHolder();
-		insert(new BoundSql(sql), magicKeyHolder);
+		insert(new BoundSql(sql, this), magicKeyHolder);
 		return magicKeyHolder.getLongKey();
 	}
 
@@ -371,7 +371,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
 	 */
 	@Comment("执行insert操作,返回插入主键")
 	public Object insert(@Comment("`SQL`语句") String sql, @Comment("主键列") String primary) {
-		return insert(new BoundSql(sql), primary);
+		return insert(new BoundSql(sql, this), primary);
 	}
 
 	void insert(BoundSql boundSql, MagicKeyHolder keyHolder) {
@@ -435,6 +435,11 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
 		return page(boundSql, page);
 	}
 
+	@UnableCall
+	public String getDataSourceName(){
+		return this.dataSourceNode == null ? "unknown" : dataSourceNode.getName();
+	}
+
 	@UnableCall
 	public Object page(BoundSql boundSql, Page page) {
 		assertDatasourceNotNull();