mirror of
https://gitee.com/ssssssss-team/magic-api.git
synced 2026-06-04 04:49:30 +08:00
新增SQL日志打印配置
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user