spring获取mybatis语句

匿名 (未验证) 提交于 2019-12-02 23:36:01
 切面类:  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&&paramValues.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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!