切面类:
import com.alibaba.fastjson.JSONObject;
import com.tasu.server.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.*;
@Aspect
@Component
@Slf4j
public class WebRequestAspect {
@Autowired
private SqlSessionFactory sqlSessionFactory;
@Pointcut("execution( * com.tasu.server..dao.*.*(..))")
public void logDao() {
}
@Before("logDao()")
public void before(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
log.info("dao请求地址 : " + request.getRequestURL().toString());
log.info("dao请求类型 : " + request.getMethod());
log.info("dao实现方法: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
log.info("dao参数 : " + Arrays.toString(joinPoint.getArgs()));
//仅获取无参数语句
String sql =sqlSessionFactory.getConfiguration().getMappedStatement(joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()).getBoundSql(null).getSql();
//获取最终执行的sql语句
String sql=new MyBatisSqlUtils().execute(joinPoint.getSignature().getName(),
joinPoint.getArgs(),sqlSessionFactory);
}
}
工具类:
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.mapping.ParameterMode;
import org.apache.ibatis.session.SqlSessionFactory;
import java.sql.Timestamp;
import java.util.*;
public class MyBatisSqlUtils {
public String execute(String sqlId,Object[] args,SqlSessionFactory sqlSessionFactory) throws Exception {
Map<String, Object> paramMap = initParamMap(args);
MappedStatement ms = sqlSessionFactory.getConfiguration()
.getMappedStatement(sqlId);
BoundSql boundSql = ms.getBoundSql(paramMap);
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
List<Object> paramValues = getParamValues(paramMap, parameterMappings);
// 获取执行的sql,此时未设置参数
String sql = boundSql.getSql();
if(args!=null&&args.length==1&&(args[0] instanceof String)){
paramValues.add(args[0]);
}
String execSql = getExecuteSql(sql, paramValues);
System.out.println("sql:"+execSql);
return execSql;
}
/**
* 设置查询参数值,返回可直接执行的sql
*/
private String getExecuteSql(String sql, List<Object> paramValues) {
while(sql.indexOf("?") != -1 && paramValues!=null&¶mValues.size() > 0&& paramValues.get(0)!=null) {
Object paramValue = paramValues.get(0);
if (paramValue != null) {
String value = paramValue.toString();
if (paramValue instanceof String) {
value = "'" + paramValue.toString() + "'";
}
else if (paramValue instanceof Date || paramValue instanceof Timestamp) {
value = DateUtil.dateToStr((Date) paramValue,"yyyy-MM-dd HH:mm:ss");
value = "str_to_date('" + value + "','%Y-%m-%d %T')";
}
sql = sql.replaceFirst("\\?", value);
paramValues.remove(0);
}
}
return sql;
}
/**
* 根据动态查询条件获取查询参数值
*/
private List<Object> getParamValues(Map<String,Object> paramMap,
List<ParameterMapping> parameterMappings) {
if (parameterMappings == null) {
return new ArrayList<Object>();
}
List<Object> paramValues = new ArrayList<Object>();
for (ParameterMapping pm : parameterMappings) {
if (pm.getMode() != ParameterMode.OUT) {
String paramName = pm.getProperty();
Object paramValue = paramMap.get(paramName);
paramValues.add(paramValue);
}
}
return paramValues;
}
/**
* 初始化查询参数
*/
private Map<String, Object> initParamMap(Object[] args) {
Map<String, Object> paramMap = new HashMap<String, Object>();
for (Object obj : args) {
if(obj instanceof Map){
paramMap = (Map<String, Object>) obj;
}
}
return paramMap;
}
}