diff --git a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java index 1715bd11..472f76d8 100644 --- a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java +++ b/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 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()); diff --git a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIProperties.java b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIProperties.java index 13786d29..86c9936c 100644 --- a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIProperties.java +++ b/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; + } + } diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/interceptor/DefaultSqlInterceptor.java b/magic-api/src/main/java/org/ssssssss/magicapi/interceptor/DefaultSqlInterceptor.java new file mode 100644 index 00000000..95aac9ad --- /dev/null +++ b/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); + } + } +} diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/modules/BoundSql.java b/magic-api/src/main/java/org/ssssssss/magicapi/modules/BoundSql.java index 6389f527..57ad7fa3 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/modules/BoundSql.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/modules/BoundSql.java @@ -33,23 +33,17 @@ public class BoundSql { private List parameters = new ArrayList<>(); - private SqlCache sqlCache; - - private String cacheName; - - private long ttl; - private Set excludeColumns; + private SQLModule sqlModule; + public BoundSql(String sql, List 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 getCacheValue(String sql, Object[] params, Supplier 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; } diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/modules/SQLModule.java b/magic-api/src/main/java/org/ssssssss/magicapi/modules/SQLModule.java index f59c79c2..841e0a15 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/modules/SQLModule.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/modules/SQLModule.java @@ -342,7 +342,7 @@ public class SQLModule extends HashMap 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 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 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 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();