切面类: 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(); 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) { paramMap = (Map<String, Object>) obj; } return paramMap; } }
文章来源: https://blog.csdn.net/wooden_people/article/details/90676121