spring获取mybatis语句

切面类:

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&&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) {
           if(obj instanceof Map){
                paramMap = (Map<String, Object>) obj;
            }
        }
        return paramMap;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值